#include<stdio.h>
int place[8]={0};//用来记录第n个皇后所在的列;
bool flag[8]={1,1,1,1,1,1,1,1};//用来宣布第col列已经被占领;
bool d1[15]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};//用来宣布第n个皇后的右上方向对角线已经被占领;
bool d2[15]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};//用来宣布第n个皇后的左上方向对角线已经被占领;
int number;//用来记录当前结果是第几组
void ganerate(int n);
void print();
int main(){
ganerate(0);
}
void ganerate(int n){
int col;
for(col=0;col<8;col++){
if(flag[col]&&d1[n-col+7]&&d2[n+col]){//如过列,上斜,下斜都没有被占领,则放置第n个皇后
place[n]=col;//表示第n个皇后的位置
flag[col]=false;//表示此列已经被占领
d1[n-col+7]=false;//表示此条右向对角线已经被占领
d2[n+col]=false;//表示此条左向对角巷已经被占领
if(n<7){
ganerate(n+1);
}else{
//打印此组结果
print();
}
//回溯处理
flag[col]=1;
d1[n-col+7]=1;
d2[n+col]=1;
}
}
}
void print(){
number++;
int num[8][8]={0};
printf("N0.%d\n",number);
for(int i=0;i<8;i++){
//初始化皇后所在的位置为1;
num[i][place[i]]=1;
}
//打印
for(int i=0;i<8;i++){
for(int j=0;j<8;j++){
printf("%d ",num[i][j]);
}
printf("\n");
}
}
03-30
6840
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
03-27
8124
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交