C#,动态规划(DP)N皇后问题(N Queen Problem)的回溯(Backtracking)算法与源代码

1 N皇后问题(N Queen Problem)

在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。

2 回溯算法

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

回溯法也称试探法,它的基本思想是:从问题的某一种状态(初始状态)出发,搜索从这种状态出发所能达到的所有“状态”,当一条路走到“尽头”的时候(不能再前进),再后退一步或若干步,从另一种可能“状态”出发,继续搜索,直到所有的“路径”(状态)都试探过。这种不断“前进”、不断“回溯”寻找解的方法,就称作“回溯法”。

3 源程序

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;

namespace Legalsoft.Truffer.Algorithm
{
    /// <summary>
    /// N皇后问题
    /// </summary>
    public static partial class Algorithm_Gallery
    {
        private static bool NQP_IsSafe(int[,] board, int row, int col)
        {
            int N = board.GetLength(0);
            for (int i = 0; i < col; i++)
            {
                if (board[row, i] == 1)
                {
                    return false;
                }
            }
            for (int i = row, j = col; i >= 0 && j >= 0; i--, j--)
            {
                if (board[i, j] == 1)
                {
                    return false;
                }
            }
            for (int i = row, j = col; j >= 0 && i < N; i++, j--)
            {
                if (board[i, j] == 1)
                {
                    return false;
                }
            }
            return true;
        }

        private static bool NQP_Utility(ref int[,] board, int col)
        {
            int N = board.GetLength(0);
            if (col >= N)
            {
                return true;
            }
            for (int i = 0; i < N; i++)
            {
                if (NQP_IsSafe(board, i, col))
                {
                    board[i, col] = 1;

                    if (NQP_Utility(ref board, col + 1) == true)
                    {
                        return true;
                    }
                    board[i, col] = 0;
                }
            }
            return false;
        }

        public static bool NQP_Solve(int n,out int[,] board)
        {
            board = new int[n, n];            

            if (NQP_Utility(ref board, 0) == false)
            {
                return false;
            }

            return true;
        }

        public static string ToHtml(int[,] board)
        {
            int N = board.GetLength(0);
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("<style>");
            sb.AppendLine("td { padding:5px;text-align:center; }");
            sb.AppendLine("</style>");
            sb.AppendLine("<table border=1 bordercolor='#999999' style='border-collapse:collapse;'>");
            for (int i = 0; i < N; i++)
            {
                sb.AppendLine("<tr>");
                for (int j = 0; j < N; j++)
                {
                    sb.AppendLine("<td>" + board[i, j] + "</td>");
                }
                sb.AppendLine("</tr>");
            }
            sb.AppendLine("</table>");
            return sb.ToString();
        }
    }
}
 

————————————————————————————————

POWER BY 315SOFT.COM

4 源代码

using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{/// <summary>/// N皇后问题/// </summary>public static partial class Algorithm_Gallery{private static bool NQP_IsSafe(int[,] board, int row, int col){int N = board.GetLength(0);for (int i = 0; i < col; i++){if (board[row, i] == 1){return false;}}for (int i = row, j = col; i >= 0 && j >= 0; i--, j--){if (board[i, j] == 1){return false;}}for (int i = row, j = col; j >= 0 && i < N; i++, j--){if (board[i, j] == 1){return false;}}return true;}private static bool NQP_Utility(ref int[,] board, int col){int N = board.GetLength(0);if (col >= N){return true;}for (int i = 0; i < N; i++){if (NQP_IsSafe(board, i, col)){board[i, col] = 1;if (NQP_Utility(ref board, col + 1) == true){return true;}board[i, col] = 0;}}return false;}public static bool NQP_Solve(int n,out int[,] board){board = new int[n, n];            if (NQP_Utility(ref board, 0) == false){return false;}return true;}public static string ToHtml(int[,] board){int N = board.GetLength(0);StringBuilder sb = new StringBuilder();sb.AppendLine("<style>");sb.AppendLine("td { padding:5px;text-align:center; }");sb.AppendLine("</style>");sb.AppendLine("<table border=1 bordercolor='#999999' style='border-collapse:collapse;'>");for (int i = 0; i < N; i++){sb.AppendLine("<tr>");for (int j = 0; j < N; j++){sb.AppendLine("<td>" + board[i, j] + "</td>");}sb.AppendLine("</tr>");}sb.AppendLine("</table>");return sb.ToString();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/491871.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux软件高级编程-进程基本概念--day6

1.进程&#xff1a; 程序&#xff1a; 存放在外存的一段数据组成的文件 进程&#xff1a; 是一个程序动态执行的过程&#xff0c;包括进程的创建、进程的调度、进程的消亡 2.进程相关命令&#xff1a; 1&#xff09;top&#xff1a; 动态查看当前系统中所有进程信息&#xff08…

(Linux学习一):Mac安装vmWare11.5,centOS 7安装步骤教程

一。下载vmware 官网地址&#xff1a;下载地址 由于我的电脑系统是Mac 10.15.6版本系统&#xff0c;我下载的是VMware Fusion 11.5版本&#xff0c;13是最新版本不支持安装需要系统在11以上。 百度网盘下载地址: VMware Fusion 11 VMware Fusion 12 VMware Fusion 13 下载需要…

万界星空科技商业开源MES

一、万界星空科技商业开源MES系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、市面上最好的开源MES、MES源代码、适合二开的开源MES。 1.万界星空开源MES制造执行系统的Java开源版本。 开源mes系统包括系统管理&#xff0c;车间基础数据管理&#xff0c;计…

【管理咨询宝藏资料25】某能源集团五年发展战略报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料25】某能源集团五年发展战略报告 【关键词】战略规划、五年战略、管理咨询 【文件核心观点】 - LL应以快速做大做强为目标&#xff0c;专注…

五.AV Foundation 视频播放 - 标题和字幕

引言 本篇博客主要介绍使用AV Foundation加载视频资源的时候&#xff0c;如何获取视频标题&#xff0c;获取字幕并让其显示到播放界面。 设置标题 资源标题的元数据内容&#xff0c;我们需要从资源的commonMetadata中获取&#xff0c;在加载AVPlayerItem的时候我们已经指定了…

docker安装mongodb

1.使用docker安装mongo 1.1下载MongoDB镜像 docker pull mongo:4.4 1.2运行MongoDB容器 docker run -itd --name mongo -v /docker_volume/mongodb/data:/data/db -p 27017:27017 mongo:4.4 --auth 2.创建用户 2.1 登录mongo容器&#xff0c;并进入到【admin】数据库 dock…

kafka生产者

1.原理 2.普通异步发送 引入pom&#xff1a; <dependencies><dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.0.0</version></dependency><dependency><g…

【wails】(6):使用wails做桌面应用开发,使用gin+go-chatglm.cpp进行本地模型运行,在windows上运行成功

1&#xff0c;整体架构说明 主要使用&#xff0c;参考的开源项目是&#xff1a; https://github.com/wailsapp/wails 前端项目&#xff1a; https://github.com/Chanzhaoyu/chatgpt-web 运行模型&#xff1a; https://github.com/Weaxs/go-chatglm.cpp 参考代码&#xff1a; h…

Python算法题集_实现 Trie [前缀树]

Python算法题集_实现 Trie [前缀树] 题208&#xff1a;实现 Trie (前缀树)1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【定义数据类默认字典】2) 改进版一【初始化字典无额外类】3) 改进版二【字典保存结尾信息无额外类】 4. 最优算法5. 相关…

JAVA集合进阶(Set、Map集合)

一、Set系列集合 1.1 认识Set集合的特点 Set集合是属于Collection体系下的另一个分支&#xff0c;它的特点如下图所示 下面我们用代码简单演示一下&#xff0c;每一种Set集合的特点。 //Set<Integer> set new HashSet<>(); //无序、无索引、不重复 //Set<…

Vulnhub靶机:Hacker_Kid

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;Hacker_Kid&#xff08;10.0.2.42&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://download.vulnhub.com/hac…

信息抽取(UIE):使用自然语言处理技术提升证券投资决策效率

一、引言 在当今快速变化的证券市场中&#xff0c;信息的价值不言而喻。作为一名资深项目经理&#xff0c;我曾领导一个关键项目&#xff0c;旨在通过先进的信息抽取技术&#xff0c;从海量的文本数据中提取关键事件&#xff0c;如企业并购、新产品发布以及政策环境的变动。这些…