1213:八皇后问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 33706 通过数: 12525
【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
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
...以下省略
题解
输出所有方案,具体见c++信息学奥赛一本通1214题解_Asad_Yuen的博客-优快云博客
#include<bits/stdc++.h>
using namespace std;
int a[105][10],b[10],c[20],d[20],sum=1;
void search(int i){
for(int j=1; j<=8; j++){
if(!b[j] && !c[i-j+7] && !d[i+j]){
a[sum][i]=j;
b[j]=1;
c[i-j+7]=1;
d[i+j]=1;
if(i==8){
sum++;
int x=9;
while(x--){
a[sum][x]=a[sum-1][x];
}
}
else search(i+1);
b[j]=0;
c[i-j+7]=0;
d[i+j]=0;
}
}
}
int main(){
search(1);
for(int k=1; k<=92; k++){
printf("No. %d\n",k);
for(int h=1; h<=8; h++){
for(int j=1; j<=7; j++){
if(a[k][j]==h) printf("1 ");
else printf("0 ");
}
if(a[k][8]==h) printf("1");
else printf("0");
printf("\n");
}
}
return 0;
}
码字不易,关注点赞收藏支持一下吧!