C++经典算法解决八皇后问题!超详细源码解答!

小编是一个有着5年工作经验的全栈开发工程师,关于C++编程,自己有做材料的整合,一个完整的C++编程学习路线,学习材料和工具,能够进我的群8254,14254收取,免费送给大家,希望你也能凭着自己的努力,成为下一个优秀的程序员。

八皇后问题即指在一个8*8的棋盘上放置8个皇后,不允许任何两个皇后在棋盘的同一行、同一列和同一对角线上。关键字:递归、上溯.通用技巧:

经观察发现,对8x8的二维数组上的某点a[i][j](0<=i,j<=7)

其主对角线(即左上至右下)上的每个点的i-j+7的值(范围在(0,14))均相等;

其从对角线(即右上至左下)上的每个点的i+j的值(范围在(0,14))均相等;

且每个主对角线之间的i-j+7的值均不同,每个从对角线之间的i-j+7的值亦不同;

如a[3][4]:

主:3-4+7=6

从:3+4=7

因此可设两个数组b[15],c[15]分别表示主、从对角线是否安全

(为1表示有皇后,不安全;为0表示安全)

每行有且仅有一个皇后:

每i个皇后放在每i行(0<=i<=7)

voideightQueens(intline);

题目描述:

会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。

对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。

给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。

输入:

第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1<=b<=92)

输出:

输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。

样例输入:

2

1

92

样例输出:

15863724

84136275

思路

先贴出一个可以ac的摆放位置出来,防止大家连国际象棋棋盘的样子都不清楚。

由于八个皇后不能处在同一行,那么可以肯定每个皇后占据一行。我们可以先定义一个数组column[9],数组中的第i个数字表示位于第i行皇后的列号(因为数组下标从0开始,因此这里想表示1-8需要申请9个整型的数据空间)。

先把column数组初始化为1-8,忽略开始的第一个元素

接下来,对column做无重复的全排列,因为我们使用不同的数字对column进行初始化,所以八皇后肯定在不同的列。

接下来,我们只需要判断八皇后是否在同一对角线即可,学过数学的都知道,可以表示为y=x+b或者y=-x+b

/**************************************************************

Problem:1140

User:wangzhengyi

Language:C

Result:Accepted

Time:10ms

Memory:916kb

****************************************************************/

dfs思路

其实就是dfs挨层遍历,找出所有符合要求的组合,直接上ac代码

THE END
1.关于八皇后问题以及回溯递归思想大家好,我是“Stephen·谢”,本文以古老的八皇后问题的文字解释和代码实现,将递归回溯的思想概念介绍给大家。 国际象棋中的皇后比中国象棋里的大车还厉害,皇后能横向,纵向和斜向移动,在这三条线上的其他棋子都可以被吃掉。所谓八皇后问题就是:将八位皇后放在一张8x8的棋盘上,使得每位皇后都无法吃掉别的皇后,(即https://www.jianshu.com/p/65c8c60b83b8
2.递归算法学习系列之八皇后问题八皇后问题递归算法递归算法学习系列之八皇后问题 1.引子 中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每走一步都更靠近目标结果一些,直到遇到障碍物,我们才考虑往回走。然后再继续尝试向前。https://blog.csdn.net/garfielder007/article/details/48811597/
3.栈(stack)递归(八皇后问题)排序算法分类,时间和空间复杂度简介栈(stack)、递归(八皇后问题)、排序算法分类,时间和空间复杂度简介,一、栈的介绍:1)栈的英文为(stack)2)栈是一个先入后出(FILO-FirstInLastOut)的有序列表。3)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端https://blog.51cto.com/u_15127559/4525280
4.CPP递归与回溯入门·八皇后问题腾讯云开发者社区【CPP】递归与回溯入门·八皇后问题 八皇后问题,一个经典的回溯算法问题。在8*8的国际象棋棋盘上如何才能放上八只皇后棋子,使它们彼此不会互相攻击到。皇后,是能攻击到以自己为中心的横线竖线和正斜线的强大棋子,在这样的棋盘上摆放8个皇后,这个程序就是要解决到底有多少种摆放法。历史上有那么多的大师研究这个https://cloud.tencent.com/developer/article/1670153
5.经典回溯算法——八皇后问题经典回溯算法——八皇后问题 八皇后问题是由19世纪数学家“搞死先生”(高斯先生)提出的,具体的问题是这样的: 在国际象棋的棋盘中(有8×8格)摆放8个皇后,这八个皇后不能相互攻击到(皇后的攻击方向很广:横着,竖着,斜着都能攻击),即8个皇后不能处于同行、同列、同一正反对角线上,这样就不能相互攻击到了。那么https://www.nowcoder.com/discuss/83692
6.科学网—经典的算法回顾子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较https://blog.sciencenet.cn/blog-315535-665392.html
7.23Julia编程示例–递归趣例Julia语言入门23.2.2 递归算法 穷举法完全不考虑已经摆放的棋子,所以另一种更好的做法是使用递归算法,先在第一行摆下一颗棋子,这有8种摆法;然后,在第二行试图摆下第二颗棋子,使得与第一颗棋子不冲突;再考虑第三颗棋子,如此一直到第八颗棋子。这个过程中如果某颗棋子无法摆放,就退回到上一颗棋子的下一个位置;找到一种摆法https://www.math.pku.edu.cn/teachers/lidf/docs/Julia/html/_book/exa-recurse.html
8.八皇后(最小冲突法)解决八皇后问题 用简单的java语言解决了八皇后问题,适用于初学者。 上传者:u012249535时间:2013-12-07 算法设计文档(含回溯法 递归法 贪心算法 背包) 算法讲的很详细,对学习算法和准备面试工作的朋友都很有帮助,推荐你下载学习! 上传者:chendonghui198484时间:2010-11-26 https://www.iteye.com/resource/u010890477-7014031
9.11.5.八皇后问题?求解—Python3教程文档如果下一个皇后和当前皇后的水平距离为0(在同一列)或与它们的垂直距离相等(位于一条对角线上),这个表达式就为真;否则为假。 基线条件? 八皇后问题解决起来有点棘手,但通过使用生成器并不太难。然而,如果你不熟悉递归,就 很难自己想出这里的解决方案。另外,这个解决方案的效率不是特别高,因此皇后非常多时,其https://www.osgeo.cn/python-tutorial/advfea-queenseight.html
10.C语言回溯法解八皇后问题(八皇后算法)C语言八皇后问题(N皇后问题)的回溯法求解一、问题描述在一个国际象棋棋盘上放置八个皇后,使得任何两个皇后之间不相互攻击,求出所有的布棋方法,并推广到N皇后情况。二、参考资料啥文字都不用看,B站上有个非常详细的动画视频解说,上链接!!!Click Here!三、源代码https://www.jb51.net/article/233081.htm
11.算法精粹:经典计算机科学问题的Python实现数字图书馆灯塔2.3.1 表达问题 2.3.2 求解 2.4 现实世界的应用 2.5 习题 第3 章 约束满足问题 3.1 构建约束满足问题的解决框架 3.2 澳大利亚地图着色问题 3.3 八皇后问题 3.4 单词搜索 3.5 字谜(SEND+MORE=MONEY) 3.6 电路板布局 3.7 现实世界的应用 3.8 习题 第4 章 图问题 4.1 地图就是图 4.2 搭建图的框架 4.3 查https://www.dtdjzx.gov.cn/szlib/jykj/2817585.jhtml
12.C++代码(2)八皇后问题huaxiazhihuoC++代码(2)八皇后问题 八皇后实在太有名了,我也就不废话了。利用回溯算法,不难写出其代码,相信各位同学也都干过了。那这篇文章还有何新意呢?难道是向各位展示在下的代码要比各位好,绝对不是。只因用C++写代码的时候,很容易就陷入各种细节的纠缠中,必须牢记大刀阔斧地砍除无关紧要的细节,始终坚持用C++清晰地表http://www.cppblog.com/huaxiazhihuo/archive/2011/07/13/150889.aspx
13.算法学习与应用从入门到精通2.5.1 贪心算法基础 23 2.5.2 实践演练—解决“装箱” 问题24 2.5.3 实践演练—解决 “找零方案”问题 26 2.6 试探法算法思想 27 2.6.1 试探法算法基础 27 2.6.2 实践演练—解决 “八皇后”问题 28 2.6.3 实践演练—体彩29选 7彩票组合 29 2.7 迭代算法 30 2.7.1 迭代算法基础 30 2.7.2 实践演练—http://reader.hnlib.com/Book/Detail/377965