1213:八皇后问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 23297 通过数: 8514
【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
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
...以下省略
#include<bits/stdc++.h>
using namespace std;
int mp[10000][10000]={0};
bool vy[10000],vd1[10000],vd2[10000]; //因为是以行搜索,所以只需要考虑y轴和主、副对角线
int total=0;
void dfs(int step){
if(step==9){
total++;
cout<<"No. "<<total<<endl;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
cout<<mp[j][i]<<" ";
}
cout<<endl;
}
return;
}
for(int i=1;i<=8;i++){
if(!vy[i]&&!vd1[step+i]&&!vd2[step-i+8]){ //主对角线可以用step-i+8表示,副对角线可以用step+i表示
mp[step][i]=1;
vy[i]=1;
vd1[step+i]=1;
vd2[step-i+8]=1;
dfs(step+1);
mp[step][i]=0;
vy[i]=0;
vd1[step+i]=0;
vd2[step-i+8]=0;
}
}
}
int main(){
memset(vy,0,sizeof(vy));
memset(vd1,0,sizeof(vd1));
memset(vd2,0,sizeof(vd2));
dfs(1);
return 0;
}