题目简介:
在8*8的国际象棋棋盘上,要求在每一行(或者每一列)放置一个皇后,且能做到在水平方向、竖直方向和斜方向都没有冲突。请列出所有解法。
思路:
八皇后问题是回溯法解题的基本问题。首先我们考虑一种简单情况—四皇后问题。四皇后问题我们的思路是,先在棋盘的第一行第一列放第一颗子。在下第二颗子的时候我们同样希望它被放置在第一行,即第一行第二列,但显然违背了题目要求。所以尝试其放于第二行第二列,但我们发现,这时其又不满足斜方向冲突的要求。所以尝试将其放到第三行第二列。在我们放置第三颗子时,根据前面的经验,首先尝试第一行第三列,与第一颗子在同一行,失败!尝试第二行第三列,与第二颗子在斜方向,失败!尝试第三行第三列,与第二颗子在同一行,失败!尝试第四行第三列,与第二颗子在斜方向,失败!
全部失败,仿佛我们没有了办法,这时该怎么办呢?没错,我们可以调整上一颗棋子的位置来使第三颗棋子有地可下!同样的道理,如果再失败,我们可以调整上上颗的位置。这,就是我们的回溯法了,在子问题走不通的情况下,返回上一个问题的另外一种情况。下面上代码:
#include
#include
#include
int sum=0;
int main()
{
int a[100];
Serch(a,0);
printf("%d\n",sum);
return 0;
}
void Serch(int a[],int current_layer)
{
//终止情况
if(current_layer>=8)
{
sum++;
return;
}
//遍历可行的行
for(int i=0;
i<8;
i++)
{
a[current_layer]=i;
if(check(a,current_layer))
Serch(a,current_layer+1);
a[current_layer]=NULL;
}
}
//判定放子是否正确的函数
intcheck(int a[],int n)
{
if (n==0)
return 1;
for(int i=0;
i
【八皇后问题----回溯法的应用(c语言描述)】有问题可在评论贴出,一般都会看,转载请注明出处!
推荐阅读
- 其他|有趣的10个CMD命令
- 其他|清理C盘内存(电脑C盘飘红了,那么如何清理垃圾文件,总结几种亲测方案)
- 其他|如何复制百度文库中的内容
- 谈谈base中遇到的坑点 及 其他
- 用VS Code画uml
- Mac 安装Android Studio3.0安装和卸载总结
- 其他|c++读取TXT文件内容
- util|POI兼容读取Excel2003和Excel2007
- java|Junit4精简解析
- 解决Adobe Reader XI打开就后崩溃问题