N 皇后问题

N 皇后问题研究的是如何将 N 个皇后放置在 N x N 的棋牌上,并且使皇后彼此之间不能相互攻击。

在这里插入图片描述
国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子

解决思路是:剪枝 + 回溯方法 解决问题

(1).使用二维数组创建棋牌格子 grid
(2).将数组中每个元素赋值 为 0
(3).在某一行,某一列位置,如果格子数值为 0 ,则格子可以放置皇后
(4).在一个位置放置一个皇后,记录皇后位置,并将其所在同一行、同一列、同一斜线上的格子数值 +1
(5).回溯,将原本放置皇后的位置,取消放置,删除记录,将其同一行、同一列、同一斜线上的格子数值 -1

分析:因为每一行只能放置,且必须放置一个皇后
A.使用递归函数来实现,按照每次递归一行棋牌来考虑,每一行 (M行) 只要有一个位置满足如上 (3) 条件,就可以放置皇后到该位置,我们记录放置皇后的位置,然后执行 如上 (4),
B. 然后递归到下一行(M+1行),当我们递归到某行(S行)发现没有位置可以放置皇后了,我们就要回溯 执行如上 (5),返回到上一行(S-1 行)没有放置皇后的时候,然后在上一行(S-1 行)换一个可以放置皇后的位置,来放置皇后
经过如上的递归一直到N行都放置了皇后,就完成所有皇后的放置了

代码如下

public class EightQueensProblem
{private const int N = 8;private int[,] grid = new int[N, N];private Dictionary<int, int> dic = new Dictionary<int, int>();private List<int[]> dirList = new List<int[]>(){new int[] { -1,  0 },new int[] {  1,  0 },new int[] {  0, -1 },new int[] {  0,  1 },new int[] { -1, -1 },new int[] { -1,  1 },new int[] {  1, -1 },new int[] {  1,  1 },};public EightQueensProblem(){for (int col = 0; col < N; col++){dic.Clear();// 创建棋牌格子CreateGrid();// 初始在第 1 行,不同列放置一个皇后SetQueens(0, col, true);// 因为第 1 行,已经放置了皇后了,所以从第 1 行开始计算int row = 1;Calculate(row);// 重新创建一个空的棋牌格子CreateGrid();// 将皇后放置结果填写进去foreach (var kv in dic){int r = kv.Key;int c = kv.Value;grid[r, c] = 1;}// 将棋牌打印出来Print();}}/// <summary>/// 递归 加 回溯方法 计算每一行可以放置 Queens 的位置/// </summary>/// <param name="row"></param>private void Calculate(int row){// 如果已经放置 N 个了,说明已经放置完成了if (dic.Count >= N){return;}for (int col = 0;  col < N; ++col){if (grid[row, col] == 0 && dic.Count < N){// 记录放置 Queens 的位置SetQueens(row, col, true);// 计算下一行Calculate(row + 1);// 如果已经放置 N 个了,说明已经放置完成了if (dic.Count < N){// 取消放置 Queens 的位置SetQueens(row, col, false);}}}}/// <summary>/// 打印棋牌格子/// </summary>private void Print(){for (int row = 0; row < N; ++row){string msg = string.Empty;for (int col = 0; col < N; ++col){int value = grid[row, col];msg += string.Format("{0}  ", value);}Console.WriteLine(msg);}Console.WriteLine();Console.WriteLine();}/// <summary>/// 创建棋牌格子/// </summary>private void CreateGrid(){for (int row = 0; row < N; ++row){for (int col = 0; col < N; ++col){grid[row, col] = 0;}}}/// <summary>/// row、col 放置 Queens 令 所在行、列、斜向 都 加 1/// row、col 取消 Queens 令 所在行、列、斜向 都 减 1/// </summary>/// <param name="row"></param>/// <param name="col"></param>/// <param name="add">true 放置,false 取消</param>private void SetQueens(int row, int col, bool add){if (dic.Count >= N){return;}if (add){dic[row] = col;}else{dic.Remove(row);}int offset = (add ? 1 : -1);grid[row, col] += offset;foreach (var dir in dirList){int tempRow = row;int tempCol = col;while (true){tempRow += dir[0];tempCol += dir[1];if (tempRow < 0 || tempRow >= N || tempCol < 0 || tempCol >= N){break;}grid[tempRow, tempCol] += offset;if (add){CheckSet(tempRow, tempCol);}}}}// 放置皇后时,检测同一行、同一列、同一斜线上是否已经放置了皇后private void CheckSet(int row, int col){int c = 0;if (!dic.TryGetValue(row, out c)){return;}if (c == col){Console.WriteLine("Check Error:" + row + "   " + col);}}
}

运行结果如下

在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++与QML交互总结二

目录 1.CPP调用QML 1.1 QMetaObject::invokeMethod调用 1.2 CPP中的信号绑定qml中的槽 2.QML调用CPP 2.1 QML单实例注册 2.2 将类对象注册到QML的上下文中 2.3 QML信号调用CPP槽 3.QML中注入一个cpp实例 3.1qmlRegisterType 3.2QML_ELEMENT 4.附加属性: QML_ATTACHE…

面试题:说一下SpringBoot的自动配置原理

文章目录 引言工作原理剖析EnableAutoConfiguration自动配置生效总结 引言 不论在工作中&#xff0c;亦或是求职面试&#xff0c;Spring Boot已经成为我们必知必会的技能项。除了某些老旧的政府项目或金融项目持有观望态度外&#xff0c;如今的各行各业都在飞速的拥抱这个已经…

c==ubuntu+vscode debug redis7源码

新建.vscode文件夹&#xff0c;创建launch.json和tasks.json {"version": "0.2.0","configurations": [{"name": "C/C Launch","type": "cppdbg","request": "launch","prog…

Flink CDC MySQL同步MySQL错误记录

1、启动 Flink SQL [appuserwhtpjfscpt01 flink-1.17.1]$ bin/sql-client.sh2、新建源表 问题1&#xff1a;Encountered “(” 处理方法&#xff1a;去掉int(11)&#xff0c;改为int Flink SQL> CREATE TABLE t_user ( > uid int(11) NOT NULL AUTO_INCREMENT COMME…

1 论文笔记:Efficient Trajectory Similarity Computation with ContrastiveLearning

2022CIKM 1 intro 1.1 背景 轨迹相似度计算是轨迹分析任务&#xff08;相似子轨迹搜索、轨迹预测和轨迹聚类&#xff09;最基础的组件之一现有的关于轨迹相似度计算的研究主要可以分为两大类&#xff1a; 传统方法 DTW、EDR、EDwP等二次计算复杂度O(n^2)缺乏稳健性 会受到非…

【Linux】进程控制基础知识

目录 一&#xff0c;fack回顾 二&#xff0c;进程终止 1.进程终止&#xff0c;操作系统做了什么&#xff1f; 2.进程终止&#xff0c;常见的方式 1.main函数的&#xff0c;return 返回码 2. exit()函数 三&#xff0c;进程等待 1. 回收进程方法 &#xff08;1. wait…

Node.js 学习笔记

小插件Template String Converter 当输入${}时&#xff0c;自动为其加上 反引号 一、node入门 node.js是什么 node的作用 开发服务器应用 开发工具类应用 开发桌面端应用 1.命令行工具 命令的结构 常用命令 切换到D盘——D: 查看D盘目录——dir 切换工作目录——c…

FFmpeg 命令:从入门到精通 | FFmpeg 音视频处理流程

FFmpeg 命令&#xff1a;从入门到精通 | FFmpeg 音视频处理流程 FFmpeg 命令&#xff1a;从入门到精通 | FFmpeg 音视频处理流程实例 FFmpeg 命令&#xff1a;从入门到精通 | FFmpeg 音视频处理流程 实例 ffmpeg -i test_1920x1080.mp4 -acodec copy -vcodec libx264 -s 1280x…

ElasticSearch - 基于 DSL 、JavaRestClient 实现数据聚合

目录 一、数据聚合 1.1、基本概念 1.1.1、聚合分类 1.1.2、特点 1.2、DSL 实现 Bucket 聚合 1.2.1、Bucket 聚合基础语法 1.2.2、Bucket 聚合结果排序 1.2.3、Bucket 聚合限定范围 1.3、DSL 实现 Metrics 聚合 1.4、基于 JavaRestClient 实现聚合 1.4.1、组装请求 …

XSS详解

XSS一些学习记录 XXS短标签、属性、事件、方法短标签属性事件函数弹窗函数一些对于绕过有用的函数一些函数使用payload收集 浏览器编码问题XML实体编码URL编码JS编码混合编码 一些绕过方法利用constructor原型污染链构造弹框空格绕过圆括号过滤绕过其他的一些绕过 参考 XXS短标…

Zygisk-IL2CppDumper对抗方案

众所周知&#xff0c;Unity引擎中有两种脚本编译器&#xff0c;分别是 Mono 和 IL2CPP 。这两种脚本编译器各有优势&#xff0c;同时也存在一些安全性问题&#xff0c;本文将从游戏安全角度对其进行分析并提供对策。 Mono 是由跨平台的开源.NET 实现&#xff0c;它允许开发者使…

关于 自定义的RabbitMQ的RabbitMessageContainer注解-实现原理

概述 RabbitMessageContainer注解 的主要作用就是 替换掉Configuration配置类中的各种Bean配置&#xff1b; 采用注解的方式可以让我们 固化配置&#xff0c;降低代码编写复杂度、减少配置错误情况的发生&#xff0c;提升编码调试的效率、提高业务的可用性。 为什么说“降低…

PMSM——转子位置估算基于QPLL

文章目录 前言仿真模型观测器速度观测位置观测转矩波形电流波形 前言 今后是电机控制方向的研究生的啦&#xff0c;期待有同行互相交流。 仿真模型 观测器 速度观测 位置观测 转矩波形 电流波形

QSS之QScrollArea

QScrollArea在实际的开发过程中经常使用&#xff0c;主要是有些界面一屏显示不下&#xff0c;所以得用QScorllArea带滚动条拖动显示剩余的界面。默认的QScrollArea滚动条不满设计的风格&#xff0c;因此我们必须设置自已的滚动条风格&#xff0c;QScrollBar分为水平horizontal和…

Spring整合RabbitMQ——生产者

1.生产者整合步骤 添加依赖坐标&#xff0c;在producer和consumer模块的pom文件中各复制一份。 配置producer的配置文件 配置producer的xml配置文件 编写测试类发送消息

2023 年前端 UI 组件库概述,百花齐放!

UI组件库提供了各种常见的 UI 元素&#xff0c;比如按钮、输入框、菜单等&#xff0c;只需要调用相应的组件并按照需求进行配置&#xff0c;就能够快速构建出一个功能完善的 UI。 虽然市面上有许多不同的UI组件库可供选择&#xff0c;但在2023年底也并没有出现一两个明确的解决…

【C++】map、set,multiset和multimap的使用及底层原理【完整版】

目录 一、map和set的使用 1、序列式容器和关联式容器 2、set的使用讲解 3、map的使用讲解 二、multiset和multimap 1、multiset和multimap的使用 2、OJ题&#xff1a;前k个高频单词 一、map和set的使用 1、序列式容器和关联式容器 序列式容器&#xff1a;vector/list/s…

基于微信小程的流浪动物领养小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

CSS 选择器Day01

CSS 定义&#xff1a;层叠样式表(Cascading Style Sheets&#xff0c;缩写为 CSS)&#xff0c;是一种用于定义网页或文档的外观和样式的标记语言。 CSS是一种 样式表 语言&#xff0c;用来描述 HTML 文档的呈现 (美化内容)。它用于控制文本的字体、颜色、间距、布局、背景等各…

如何使用Docker安装最新版本的Redis并设置远程访问(含免费可视化工具)

文章目录 安装Docker安装Redisredis.conf文件远程访问Redis免费可视化工具相关链接Docker是一种开源的应用容器引擎,使用Docker可以让我们快速部署应用环境,本文介绍如何使用Docker安装最新版本的Redis。 安装Docker 首先需要安装Docker,具体的安装方法可以参考Docker官方文…