八皇后问题递归回溯法
程序员文章站
2022-05-25 21:15:46
...
写在前面:最开始接触是数据结构老师在提到过,后来在学python时老师也有提到过,出于好奇就去思考了这个问题,当然,小白的我还是在B站懒猫老师的帮助下学会啦,真棒哈哈哈哈哈哈
这里主要问题是在于判断对角线上是否能放,表示上对角线d1[],表示下对角线d2[],根据老师所说加上自己的理解,同一个下对角线上 n-col+7相同(n表示行,col表示列)
同理,上对角线上n+col 相同
由以上可得判断的标准为(flag[col]&&d1[n-col+7]&&d2[n+col]==ture),只要符合这个就能判断是否能放入棋子
place[n]=col;//摆放皇后
flag[col]=false;//宣布占领第col列
d1[n-col+7]=false;//占领上对角线
d2[n+col]=false;//占领下对角线
#include<stdio.h>
#include <stdbool.h>
int place[8]={0}; //第n个皇后所占位置的列号
bool flag[8]={1,1,1,1,1,1,1,1}; //标志数组,表示第col列是否可占,1表示不冲突
bool d1[15]={1,1,1,1.1,1.1,1,1,1,1,1,1,1,1};
bool d2[15]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}; //表示下对角线是否可占
int number = 0; //用于统计解的数量(八皇后总共有92个解)
void print();
void gernerate(int n);
int main(){
gernerate(0);
return 0;
}
void gernerate(int n){
int col;
for(col=0;col<8;col++)//每个皇后都有8种可能的列
{
if(flag[col]&&d1[n-col+7]&&d2[n+col])
{
place[n]=col;//摆放皇后
flag[col]=false;//宣布占领第col列
d1[n-col+7]=false;//占领上对角线
d2[n+col]=false;//占领下对角线
if(n<7)
gernerate(n+1);
else
print();//N=7,皇后都放完了,打印结果
//回溯,考虑其它的可行方案
flag[col]=true;
d1[n-col+7]=true;
d2[n+col]=true;
}
}
}
void print(){
//打印结果, 第n个皇后所占位置的列号
int col,i,j;
number++;
printf("No. %d\n", number);
int table[8][8]={0};
for(col=0;col<8;col++)
table[col][place[col]]=1;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
printf("%d ",table[j][i]);
}
printf("\n");
}
}
运行结果: