八皇后问题

八皇后问题(又名: 高斯八皇后)

浪尽此生 提交于 2020-02-06 03:26:48
题目连接: 八皇后问题 题目: 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b 1b 2…b 8,其中b i为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串)。 给出一个数b,要求输出第b个串。串的比较是这样的:皇后串x置于皇后串y之前,当且仅当将x视为整数时比y小。 Input 第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数b(1 <= b <= 92) Output 输出有n行,每行输出对应一个输入。输出应是一个正整数,是对应于b的皇后串。 Sample Input 2 1 92 Sample Output 15863724 84136275 注: 字符串中的数字表示不同行上的列坐标 例如15863724的含义是八个皇后分别位于(1, 1), (2, 5), (3, 8), (4, 6), (5, 3), (6, 7), (7, 2), (8, 4)处. 解题思路: 本题是 DFS 算法的一道经典例题, 一共8*8的棋盘要放8个皇后, 并且他们彼此还无法相互攻击, 那么我们很容易得到一个结论:

八皇后问题递归回溯法

穿精又带淫゛_ 提交于 2020-02-06 02:53:03
写在前面:最开始接触是数据结构老师在提到过,后来在学python时老师也有提到过,出于好奇就去思考了这个问题,当然,小白的我还是在B站懒猫老师的帮助下学会啦,真棒哈哈哈哈哈哈 这里主要问题是在于判断对角线上是否能放,表示上对角线d1[],表示下对角线d2[],根据老师所说加上自己的理解,同一个下对角线上 n-col+7相同(n表示行,col表示列) 同理,上对角线上n+col 相同 由以上可得判断的标准为(flag[col]&&d1[n-col+7]&&d2[n+col]==ture),只要符合这个就能判断是否能放入棋子 place[n]=col;//摆放皇后 flag[col]=false;//宣布占领第col列 d1[n-col+7]=false;//占领上对角线 d2[n+col]=false;//占领下对角线 #include<stdio.h> #include <stdbool.h> int place[8]={0}; //第n个皇后所占位置的列号 bool flag[8]={1,1,1,1,1,1,1,1}; //标志数组,表示第col列是否可占,1表示不冲突 bool d1[15]={1,1,1,1.1,1.1,1,1,1,1,1,1,1,1}; bool d2[15]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; //表示下对角线是否可占 int

八皇后问题(书本p249)

戏子无情 提交于 2020-02-06 00:37:05
如果在同一列,列号一样;同一行,行号一样; 如果在/左斜线上,行列之和一样; 如果在\右斜线上,行列之差一样 # include <iostream> using namespace std ; bool d [ 17 ] = { 0 } , b [ 9 ] = { 0 } , c [ 17 ] = { 0 } ; //b用来判断列有没有被占领 //c是c和d都是斜方向上的线 int sum = 0 , a [ 9 ] ; //表示皇后的位置 void search ( int i ) { int j ; for ( j = 1 ; j <= 8 ; j ++ ) if ( ( ! b [ j ] ) && ( ! c [ i + j ] ) && ( ! d [ i - j + 7 ] ) ) //如果列未占领&& { a [ i ] = j ; b [ j ] = 1 ; c [ i + j ] = 1 ; d [ i - j + 7 ] = 1 ; if ( i == 8 ) //摆放完了就输出呗 { int j ; sum ++ ; cout << "sum=" << sum << endl ; for ( int j = 1 ; j <= 8 ; j ++ ) cout << a [ j ] << " " ; cout << endl ; } else search (

后宫佳丽三千,皇后只有一个

随声附和 提交于 2020-02-02 00:30:04
^第13届智能车竞赛总决赛颁奖舞台 | 姚祖婵供图^ 智能车竞赛 是八皇后问题,参赛车模作品在8×8的棋格内将原本随机分布的八个棋子进行搬移,最终使其满足“八皇后”约束-即在同一行、同一列、同一正反斜对角线上只有一个棋子。比赛胜负是以参赛车模启动进入场地,直至完成任务退出场地位置的时间来衡量,用时少者胜出。 ^随机分布八个棋子的初始位置 | 比赛软件^ 规则没有限制车模进入场地的位置,在比赛棋子分布后,参赛队伍 有两分钟的出发前的准备时间。 在百度百科的“八皇后问题”词条中记录了该问题是由国际象棋手马克思.贝瑟尔与1848年(欧洲发生革命)提出的,后经使用图论方法和计算机回溯算法可以寻找出92中满足八皇后约束的结果。 ^八皇后的92种结果 | 比赛软件显示^ 如果棋子在棋盘格中的起始位置为随机分布,所有可能的初始棋局数量为: 如果限制起始时每一行,每一列只有一个棋子,那么可能的初始棋局数量为: 这些棋局移动到最接近92种满足八皇后位置约束的搬移棋子距离是各不相同的。 从随机起始位置使用最少步数满足八皇后约束 对于起始位置满足每一行、每一列只有一个棋子的初始位置,可以统计出全部40320个情形所需最少移动步数分布。 起始位置满足每行每列只有一个棋子的起始位置移动的最小步数统计 移动步数最少为0布,即初始位置就满足八皇后约束条件。最大步数为20步,没有奇数移动步数。频次最高的是移动六步

八皇后问题详细分析

流过昼夜 提交于 2020-02-01 15:09:17
八皇后问题是一个经典的算法,也是在面试中经常出现的题目。 最近也看到挺多的同学也在研究这个问题,写分享一下自己的理解吧!!! 题目描述的已经very very清楚了,就是一个皇后的8个方向都没有其他皇后,题目意思已经理解了,接下来怎么解决问题呢,怎么才能确保每一个皇后的8个方向没有其他皇后呢? 首先这个题目的解决办法肯定是暴力枚举所有情况(这里我们就得保证不能出现重复的情况),我们可以将第一行的皇后的位置先进行确定,然后再一行一行确定其他皇后的位置, 接下来就是重点了 ,首先 设置一个数组存每一列的状态(0:没有皇后,1:有皇后) ,再 设置一个数组存左上到右下位置的状态 ,再 设置一个数组存右上到左下的状态 。 行的状态已经确定好了不用管,列的状态直接存储就可以,那么 其他四个方向的状态怎么存储 呢??? 大家不妨观察每一个位置对应的行和列(以一个6*6的为例) 先假定第一个皇后的位置位于(1,2),他的右下与左下就不能有其他皇后 左上到右下的坐标为(2,3)(3,4)(4,5)(5,6)(6,7) 右上到左下的坐标为(1,2)(0,3)(-1,4)(-2,5)(-3,6) 从而可以发现规律:( x为横坐标,i为纵坐标,n为棋盘大小 ) 左上到右下的坐标和为定值 (即 x+i )(注意:下标长度可能会超出设定棋盘大小,因此需要将数组开为棋盘数组大小的二倍)

双倍快乐:两个八皇后:ybt1213&ybt1214

删除回忆录丶 提交于 2020-01-28 21:44:07
ybt1213 八皇后 & ybt1214 八皇后 ybt1213 【题目描述】 在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。 【无输入】 【输出】 按给定顺序和格式输出所有八皇后问题的解(见样例)。 【输出样例】 No. 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 No. 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 ...以下省略 【题解】 每个皇后可以吃掉所在行,列,斜线共八个方向的棋子,国际象棋棋盘共有八行八列,有2*15个斜线因此八皇后问题的策略就是在每一行,每一列,有且只有一个皇后,并且任意两个皇后不在同一斜线。 观察样例,不难发现是以每一列皇后的所在行数升序排列的,(参考ybt1214,不过与其相反,ybt1214是以每一行的列数升序排列的)所以就可以这样分类讨论。 这时就可以确定方向,从左往右一列一列的枚举

八皇后问题(java版)

无人久伴 提交于 2020-01-23 16:06:02
八皇后问题是一个古老又充满趣味的问题,想搜到这里的,想必知道什么是八皇后问题,话不多说直接写题解吧,解法思路也直接写在代码中了,个人认为很好理解 代码 //解法: /* 1.第一个皇后先放第一行第一列 2.第二个皇后放在第二行第一列,然后判断是否OK,如果不OK,继续放在第二行,第三列,依次把所有列都放完,找到一个合适 3.继续第三个皇后,还是第一列,第二列,....直到第8个皇后也能放在一个不冲突的位置,算是找到一个正确解 4.当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,放到第一列的所有正解,全部得到 5.然后回头继续第一个放第二列,后面继续循环执行1,2,3,4的步骤 说明:理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法,用一个一维数组即可解决问题,数组下标表示第几行,即第几个皇后,下标对应存放的数字表示第i+1个皇后,放在第i行的第val列 */ public class Queue8 { //定义一个max表示有多少个皇后 int max = 8 ; //定义一个数组array,保存皇后放置位置的结果 int [ ] array = new int [ max ] ; static int count = 0 ; //统计解法 public static void main ( String [ ] args ) { //测试 Queue8

八皇后问题

浪子不回头ぞ 提交于 2020-01-23 16:05:56
8个皇后的任意两个不能处在同一行,那么肯定是每一个皇后占一行。 于是我们可以定义一个string字符串,字符串中第i个数字表示位于第i行的皇后的列号。 先把string字符串分别用0~7初始化,接下来就是对字符串做全排列。 因为我们用不同的数字初始化字符串,所以任意两个皇后肯定不同列。 我们只需判断每一个排列对应的8个皇后是不是在同一对角线上, 也就是对于string的两个下标i和j,是不是有: ( j - i ) == ( str[i] - str[j] ) 或者 ( i - j ) == ( str[i] - str[j] )。 具体代码如下: 1 void Permutation(string Str, int begin, int end ,vector<string>& vec)//得到全排列 2 { 3 if(begin == end - 1) //只剩一个元素 4 { 5 vec.push_back(Str); 6 } 7 else 8 { 9 for(int k = begin; k < end; k++) 10 { 11 swap(Str[k], Str[begin]); //交换两个字符 12 Permutation(Str, begin + 1, end ,vec); 13 swap(Str[k],Str[begin]); //恢复 14 } 15 } 16

【DS】八皇后问题java代码

只谈情不闲聊 提交于 2020-01-23 15:39:29
八皇后问题简介:八 皇后 问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家 高斯 1850年提出:在8X8格的 国际象棋 上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在 柏林 的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法 解出92种结果 。计算机发明后,有多种方法可以解决此问题。 解决方法:回溯算法 Java代码: public class QueenPosition { private int x; private int y; public QueenPosition(int row, int column){ x = row; y = column; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } } 这个类是用来存储皇后放置在棋盘上的位置的。 以下这个类是解法: import java.util.ArrayList; public class EightQueens { static

递归算法学习系列之八皇后问题

孤街醉人 提交于 2020-01-23 15:36:07
1.引子 中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每走一步都更靠近目标结果一些,直到遇到障碍物,我们才考虑往回走。然后再继续尝试向前。通过这样的波浪式前进方法,最终达到目的地。当然整个过程需要很多往返,这样的前进方式,效率比较低下。 2.适用范围 适用于那些不存在简明的数学模型以阐明问题的本质,或者存在数学模型,但是难于实现的问题。 3.应用场景 在8*8国际象棋棋盘上,要求在每一行放置一个皇后,且能做到在竖方向,斜方向都没有冲突。国际象棋的棋盘如下图所示: 4.分析 基本思路如上面分析一致,我们采用逐步试探的方式,先从一个方向往前走,能进则进,不能进则退,尝试另外的路径。首先我们来分析一下国际象棋的规则,这些规则能够限制我们的前进,也就是我们前进途中的障碍物。一个皇后q(x,y)能被满足以下条件的皇后q(row,col)吃掉 1)x=row(在纵向不能有两个皇后) 2) y=col(横向) 3)col + row = y+x;(斜向正方向) 4) col - row = y-x;(斜向反方向) 遇到上述问题之一的时候,说明我们已经遇到了障碍,不能继续向前了。我们需要退回来,尝试其他路径。 我们将棋盘看作是一个8*8的数组