C#数据结构与算法系列(十四):递归——八皇后问题(回溯算法)
1.介绍
八皇后问题,是一个古老而著名的问题,是回溯算法的经典案例,该问题是国际西洋棋棋手马克斯.贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即
任意两个皇后都不能处于同一行、同一列、同一斜线。问有多少种摆法(92)。
2.思路分析
第一个皇后先放第一行第一列
第二个皇后放在第二行第一列,然后判断是否OK,如果不OK,继续放在第二列,第三列,依次把所有列都放完,找到一个合适
继续放第三个皇后,还是第一列,第二列。。。知道第8个皇后也能放在一个不冲突的位置,算是找到一个正确解
当得到一个正确解时,在栈中退到上一个栈时,就会开始回溯,即:将第一个皇后,放到第一列的所有正确解,全部得到
然后回头继续放第一个皇后放第二列,后面继续循环执行执行1,2,4步骤
说明:理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法,用一个一维数组即可解决问题. arr[8] = {0 , 4, 7, 5, 2, 6, 1, 3} //对应arr 下标 表示第几行,即第几个皇后,arr[i] = val , val 表示第i+1个皇后,放在第i+1行的第val+1列
3.图解

4.代码实现
public class EightQueens
{
//定义一个max表示共有多少个皇后
static int _max = ; //定义数组arr,保存皇后放置位置的结果,比如 arr={0,4,7,5,2,6,1,3}
static int[] _arr = new int[_max]; //初始化解法次数
static int _count = ; //初始化冲突次数
static int _judgeCount = ;
public static void Test()
{
EightQueens.Check(); Console.WriteLine($"一共有{_count}种解法"); Console.WriteLine($"一共判断冲突的次数{_judgeCount}次");
} /// <summary>
///编写一个方法,放置第n个皇后
///Check是每一次递归时,进入到Check中都有for(int i=0;i<_max;i++),因此会有回溯
/// </summary>
/// <param name="n"></param>
private static void Check(int n)
{
if (n == _max) //当n=8,说明8个皇后已经方法,因为初始值从0开始
{
Print(); return;
} //依次放入皇后,并判断是否有冲突
for (int i = ; i < _max; i++)
{
//先把当前这个皇后n,放到该行的第1列
_arr[n] = i; //判断当放置第n个皇后到i列时,是否冲突
if (Judge(n))
{
//如果不冲突,接着放n+1个皇后,即开始递归
Check(n + );
} //如果冲突,就继续执行arr[n]=i,即将第n个皇后,放置在本行的后移的一个位置
}
} /// <summary>
/// 查看当我们放置第n个皇后,就去检查该皇后是否和前面已经判断的皇后冲突
/// </summary>
/// <param name="n">表示第n个皇后</param>
/// <returns></returns>
private static bool Judge(int n)
{
_judgeCount++; for (int i = ; i < n; i++)
{
//1._arr[i] == _arr[n] 表示判断第n个皇后,是否和前面的n-1个皇后在同一列
//2.Math.Abs(n - i) == Math.Abs(_arr[n] - _arr[i])表示判断第n个皇后是否和第i个皇后在同一个斜线
//取个例子:当 n=1的时候 也就是放置第2列 Math.Abs(1-0)==Math.Abs(1-0)=1
//3.判断是否在同一行,没有必要,n每次都在递增
if (_arr[i] == _arr[n] || Math.Abs(n - i) == Math.Abs(_arr[n] - _arr[i]))
{
return false;
}
} return true;
} /// <summary>
/// 皇后的摆放位置输出
/// </summary>
private static void Print()
{
_count++; for (int i = ; i < _arr.Length; i++)
{
System.Console.Write(_arr[i] + " ");
} System.Console.WriteLine();
}
}
5.结果图

一共有92种解法
一共判断冲突的次数15720次
C#数据结构与算法系列(十四):递归——八皇后问题(回溯算法)的更多相关文章
- COJ966 WZJ的数据结构(负三十四)
WZJ的数据结构(负三十四) 难度级别:C: 运行时间限制:20000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 给一棵n个节点的树,请对于形如"u ...
- struts2官方 中文教程 系列十四:主题Theme
介绍 当您使用一个Struts 2标签时,例如 <s:select ..../> 在您的web页面中,Struts 2框架会生成HTML,它会显示外观并控制select控件的布局.样式和 ...
- 闯祸了,生成环境执行了DDL操作《死磕MySQL系列 十四》
由于业务随着时间不停的改变,起初的表结构设计已经满足不了如今的需求,这时你是不是想那就加字段呗!加字段也是个艺术活,接下来由本文的主人咔咔给你吹. 试想一下这个场景 事务A在执行一个非常大的查询 事务 ...
- SSE图像算法优化系列十:简单的一个肤色检测算法的SSE优化。
在很多场合需要高效率的肤色检测代码,本人常用的一个C++版本的代码如下所示: void IM_GetRoughSkinRegion(unsigned char *Src, unsigned char ...
- 学习ASP.NET Core Razor 编程系列十四——文件上传功能(二)
学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...
- 浅谈压缩感知(二十四):压缩感知重构算法之子空间追踪(SP)
主要内容: SP的算法流程 SP的MATLAB实现 一维信号的实验与结果 测量数M与重构成功概率关系的实验与结果 SP与CoSaMP的性能比较 一.SP的算法流程 压缩采样匹配追踪(CoSaMP)与子 ...
- MP实战系列(十四)之分页使用
MyBatis Plus的分页,有插件式的,也有其自带了,插件需要配置,说麻烦也不是特别麻烦,不过觉得现有的MyBatis Plus足以解决,就懒得配置插件了. MyBatis Plus的资料不算是太 ...
- 八皇后,回溯与递归(Python实现)
八皇后问题是十九世纪著名的数学家高斯1850年提出 .以下为python语句的八皇后代码,摘自<Python基础教程>,代码相对于其他语言,来得短小且一次性可以打印出92种结果.同时可以扩 ...
- 【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)
八皇后问题是一道经典的回溯问题.问题描述如下:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉? 看到这个问题,最容易想 ...
随机推荐
- 如何基于 echarts 在柱状图或条形图上实现转换率?(有想法吗?)
目录 需求 探索一 探索二 探索三 转换实践思路1 转换实践思路2 其他思路 探索四(揭晓答案) 答案篇说明 backgroundColor 用法 双柱合一 始终在轴的中间 百分在变,但是距离轴的距离 ...
- PAT1067 试密码 (20分)——测试点4分析 一个易错点
1067 试密码 (20分) 当你试图登录某个系统却忘了密码时,系统一般只会允许你尝试有限多次,当超出允许次数时,账号就会被锁死.本题就请你实现这个小功能. 输入格式: 输入在第一行给出一个密码( ...
- oracle11g数据库导入、导出操作
一.在linux系统中导入数据库. 1.linux中先输入 su - oracle下切换到oracle用户.然后以sysdba打开sqlplus:sqlplus / as sysdba 然后创建表空间 ...
- Rocket - jtag - JtagTap
https://mp.weixin.qq.com/s/0u9jM2u-FkTlrk3QNuZaBw 简单介绍JtagTap的实现. 1. 简单介绍 定义TAP(Test Access Port)所需要 ...
- CPU-如何开始在新的CPU上编程
https://mp.weixin.qq.com/s/rNXDPR53m--XuvJLE1CDvA 新在哪里?从未接触过.比如之前一直在x86.ARM上写程序,C比较多,汇编也调过.MIPS可能零 ...
- 【Hadoop】配置全分布式模式
分布式原理 配置 详细过程 假设有三台虚拟机,1台master主机namenode,2台slave奴隶机datanode 所有机器都要配好jdk.Java环境变量.hadoop_env.sh里java ...
- UML ——区分类图中的几种关系.md
目录 关联关系 (association): 聚合关系 (aggregation): 合成关系 (composition): 依赖关系 (dependency): 总结: 原文地址 http://ww ...
- Redis 入门到分布式 (七)Redis复制的原理与优化
一.目录 Redis复制的原理与优化 什么是主从复制 全量复制和部分复制 复制的配置 故障处理 开发运维常见问题 二. 什么是主从复制 1.单机有什么问题? 单机如果机器故障,那么久无法及时提供服务: ...
- Java实现 蓝桥杯VIP 算法提高 欧拉函数
算法提高 欧拉函数 时间限制:1.0s 内存限制:512.0MB 说明 2016.4.5 已更新试题,请重新提交自己的程序. 问题描述 给定一个大于1,不超过2000000的正整数n,输出欧拉函数,p ...
- Java实现 LeetCode 111 二叉树的最小深度
111. 二叉树的最小深度 给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例: 给定二叉树 [3,9,20,nu ...