N 皇后问题

news2024/12/23 5:10:10

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()
        {
            CreateGrid();
            Calculate(0);
            CreateGrid();
            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 的位置
                    dic[row] = col;
                    SetQueens(row, col, 1);

                    // 计算下一行
                    Calculate(row + 1);

                    // 如果已经放置 N 个了,说明已经放置完成了
                    if (dic.Count < N)
                    {
                        // 取消放置 Queens 的位置
                        dic.Remove(row);
                        SetQueens(row, col, -1);
                    }
                }
            }
        }

        /// <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();
        }

        /// <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="offset"></param>
        private void SetQueens(int row, int col, int offset)
        {
            if (dic.Count >= N)
            {
                return;
            }
            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;
                }
            }
        }
    }

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

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

相关文章

Spring MVC 和 Spring Boot 的区别

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

连接组学中的机器学习:从表征学习到模型拟合

前言 机器学习(ML)由于其高自动化程度、高灵敏度和特异性优势&#xff0c;在医学影像领域取得了巨大的成功。由于具备这些优势&#xff0c;机器学习已被广泛应用于神经成像数据&#xff0c;目的是提取与感兴趣变量(如疾病状态)相关的特征。这使我们能够形成关于不同条件下大脑…

Python之xToolkit库

文章目录 一、xToolkit是什么&#xff1f;二、准备工作1.引入库2.导入数据 三、使用时间模块-xdatetime判断时间格式是否正确get方法获取时间戳获取年月日时分秒时间推移计算时间替换时间扩展两个时间的差值开始与结束时间时间是否在指定区间中 字符串模块-xstring字符串格式校…

前端任意修改地图风格颜色

在做地图相关应用时&#xff0c;常常遇到地图风格与UI界面不搭配的问题&#xff0c;如果在制图时就制作多种风格的地图&#xff0c;耗时耗力&#xff0c;超出成本控制。这里推荐一种快捷的方法&#xff0c;可在前端快速更改地图成任意风格&#xff0c;使色调与UI搭配。 先上一张…

软件项目费用计算方法

计算软件项目的费用是项目管理的关键组成部分之一。费用计算方法可以帮助您确定项目的总成本&#xff0c;包括开发、测试、维护和其他相关费用。以下是一些常见的软件项目费用计算方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

【51单片机】8-按键

1.按键相关知识 在按键未被按下之前&#xff0c;电路中默认为高电平【1】&#xff1b; 按键被按下后&#xff0c;电路中默认为低电平【0】 1.按键工作原理 1.内部机械结构 内部是没有电路的&#xff0c;电路在引脚上&#xff0c;看着4个引脚&#xff0c;实际上里面两个引脚相互…

暗猝灭剂BHQ-1 NHS,916753-61-2,BHQ-1 SE

产品简介&#xff1a;黑洞猝灭剂-1&#xff08;BHQ-1&#xff09;被归类为暗猝灭剂&#xff08;一种非荧光发色团&#xff09;&#xff0c;被广泛用作各种荧光共振、能量转移&#xff08;FRET&#xff09;和DNA检测探针中&#xff0c;此类探针主要用于核酸分析及核酸结构研究。…

Docker export导出容器,重新运行导出的容器

需求 在部署程序时&#xff0c;程序内的人脸识别组件第一次运行需要去下载第三方软件包&#xff0c;下载好之后就不需要再进行下载了。由于程序最终部署在不能连接外网的服务器上&#xff0c;所以需要在能连接外网的服务器上先部署运行并下载相关组件。因此需要对容器进行导出&…

2023年【司钻(钻井)】考试题库及司钻(钻井)考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 司钻&#xff08;钻井&#xff09;考试题库考前必练&#xff01;安全生产模拟考试一点通每个月更新司钻&#xff08;钻井&#xff09;考试报名题目及答案&#xff01;多做几遍&#xff0c;其实通过司钻&#xff08;钻…

Linux- 网络编程初探

原始套接字&#xff08;Raw Socket&#xff09; 原始套接字&#xff08;Raw Socket&#xff09;是一种提供较低级别网络访问的套接字。通过使用原始套接字&#xff0c;应用程序可以直接发送或接收网络层如IP的数据包&#xff0c;或者传输层如TCP、UDP的段&#xff0c;而无需通…

hive数据库操作,hive函数,FineBI可视化操作

1、数据库操作 1.1、创建数据库 create database if not exists myhive;use myhive;1.2、查看数据库详细信息 desc database myhive;数据库本质上就是在HDFS之上的文件夹。 默认数据库的存放路径是HDFS的&#xff1a;/user/hive/warehouse内 1.3、创建数据库并指定hdfs存…

PASCAL数据集说明

文章目录 一.PASCAL数据集简介1.图像分割 一.PASCAL数据集简介 Pascal VOC2012数据集主要是针对视觉任务中监督学习提供标签数据&#xff0c;它有四个大类别&#xff0c;可以细分为二十个小类别&#xff1a; Person&#xff1a;personAnimal&#xff1a;bird, cat, cow, dog,…

【软件设计师-中级——刷题记录4(纯干货)】

目录 进度管理工具Grantt图&#xff1a;程序语言基础&#xff1a;高级语言源程序模式&#xff1a; 每日一言&#xff1a;持续更新中... 个人昵称&#xff1a;lxw-pro 个人主页&#xff1a;欢迎关注 我的主页 个人感悟&#xff1a; “失败乃成功之母”&#xff0c;这是不变的道理…

统计的基本概念及抽样分布

文章目录 &#x1f34b;引言&#x1f34b;总体&#xff08;Population&#xff09;&#x1f34b;总体参数 &#x1f34b;样本&#xff08;Sample&#xff09;&#x1f34b;随机样本&#x1f34b;样本统计量 &#x1f34b;统计量&#xff08;Statistic&#xff09;&#x1f34b;…

印度市场最全开发攻略,收藏一篇就够了

一提到印度市场&#xff0c;很多外贸人都会感到望而却步&#xff0c;他们说做一个印度客户&#xff0c;就等于经历了人生的酸甜苦辣…… 然而&#xff0c;印度市场也是全球一块潜力无穷的大蛋糕&#xff0c;这体现在其庞大的人口和雄厚的银行资金上&#xff08;这也是市场容量…

想学python找不到合适的书籍?它来了!入门python只需要这一本书就够了!

想学python找不到合适的书籍&#xff1f;看了视频还是不知如何下手&#xff1f; 《python王者归来》 它来了&#xff01;由清华大学出版社出版&#xff01;入门python只需要这一本书就够了&#xff01; 【PDF版领取见文末】 这是一本python入门书。无论你是计算机专业的大学生…

愿你放飞梦想,国庆快乐!Wish you a happy National Day!

国庆节是一个国家为纪念自己而设立的法定节日。它们通常是国家独立 、宪法签署、国家元首诞生或其他重要纪念日&#xff0c;有些是国家守护神的圣日。National Day is a legal holiday made by a country to commemorate the country itself. They are usually the independenc…

vue3 + elementPlus实现select下拉框插入确定和取消按钮。

实现思路 Select 选择器 | Element Plus 1、select方法visible-change这个方法是下拉框出现/隐藏时触发&#xff0c;当显示的时候将两个按钮插入到下拉框里面&#xff0c;是基于原生插入DOM的这种方式&#xff1b; 2、通过vue3 ref获取selectDOM&#xff0c;在获取select的p…

Konva基本处理流程和相关架构设计

前言 canvas是使用JavaScript基于上下文对象进行2D图形的绘制的HTML元素&#xff0c;通常用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。基于Canvas之上&#xff0c;诞生了例如 PIXI、ZRender、Fabric、Konva等 Canvas渲染引擎&#xff0c;兼顾易用的同时…

Java项目实战-查询用户列表接口服务搭建

概述 这里通过设计一个对用户进行增删改查的接口服务&#xff0c;来练习java项目工程化、Spring框架、Mybatis框架的实际应用 本项目目录 上一节初始化项目&#xff0c;已经controller层了&#xff0c;下方新建包&#xff1a;pojo、mapper、service pojo:所有的实体类都放这…