终于暑假啦(^_^)
该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
#include<bits/stdc++.h>
using namespace std;
bool lie[10],dg[20],udg[20];
bool f[10][10];
int s = 1;
void dfs(int x){
if(x==9){ // 如果搜完了
printf("No. %d\n",s);
s++;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
printf("%d ",f[i][j]);
}
printf("\n");
}
return ; //结束,返回
}
for(int i=1;i<=8;i++){ //i代表了列
if(lie[i]==0&&dg[x+i]==0&&udg[x-i+8]==0){ //如果这不是皇后控制点
lie[i] = 1; //这一列做标记,是控制点
f[x][i] = 1; //这里放一个皇后
dg[x+i] = 1; //斜边做标记
udg[x-i+8] = 1; //另一斜边做标记
dfs(x+1); //下一行
lie[i] = 0; //下面都是回溯
f[x][i] = 0;
dg[x+i] = 0;
udg[x-i+8] = 0;
}
}
}
int main()
{
dfs(1); //从第一行开始搜
return 0;
}
1715

被折叠的 条评论
为什么被折叠?



