描述
如何将n个皇后放在棋盘上(有n*n个方格),使它们谁也不能被吃掉
即n个皇后凉凉均不在同一行、同一列、同一对角线上,顺序输出皇后所在的列/行号
思路
深度优先搜索(DFS)
从第一行第一列开始
1、放入皇后,记录该皇后的列信息,进行第二行的放入;
2、第二行,由于第一列有记录了,且第二列与上一个皇后呈对角了,有3、4列的考虑,先选第三列;
3、第三行,无论放那一列都与条件冲突,因此回溯到第二行;
4、第二行,第四列可选;
5、第三行,第二列可选;
6、第四行,无论放那一列都与条件冲突,回溯到第三行,再回溯到第二行,再回溯到第一行;
7、第一行,第二列放入皇后,。。。。;
参考代码
#include <cstdio>
#include <cmath>
using namespace std;
int n,a[11],mycount(0);//自定义了最高处理10皇后问题
bool myhash[11]={0};//用来对列最标记
void dfs(int index){ //一行一行处理
if(index==n+1){ //若处理到这里,那么皇后都能填到格子中去
for(int i=1;i<n;i++){
printf("%d ",a[i]);
}
printf("%d\n",a[n]);
mycount++;//记录可行方案的个数
return;
}
for(int i=1;i<=n;i++){ //处理第index行的时候,遍历每一列
if(!myhash[i]){ //若这一列没被标记,则可以进行判断是否放皇后
bool flag =true; //先假设不冲突
for(int j=1;j<index;j++){ //一行一行操作的,也标记了列,所以只要判断是不是在对角线上
if(abs(i-a[j])==abs(index-j)){//与以有的皇后列数差和行数差若相等,则在对角线上
flag =false;
break;
}
}
if(flag){
a[index]=i; //将皇后放在这列,并记录
myhash[i]=true; //标记这列
dfs(index+1); //递归处理下一行皇后;
myhash[i]=false;//到这说明皇后放在这列的方案不可行,继续下一列的判断,清除列标记
}
}
}
}
int main()
{
scanf("%d",&n);
dfs(1);
if(mycount==0)
printf("no solute!\n");
return 0;
}
如有错误,欢迎指正