学习的视频:懒猫老师
https://www.bilibili.com/video/BV1wJ411U7Gy/?spm_id_from=333.337.search-card.all.click&vd_source=da60f9e1bc3321cae28c29fe80e9b078
代码:
编译:gcc test.c -g
#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;
}//打印结果,第n个皇后所占位置的列号
void print()//定义输出函数
{int col,i,j;number++;//每调用一次输出函数number自加一次,记录摆放方法个数printf("No.%2d\n",number);int table[8][8]={0};//设置一个8*8的棋盘for (i=0;i<8;i++){table[i][place[i]]=1;//将每一行皇后所在位置赋值为1}for (i=0;i<8;i++){for (j=0;j<8;j++){printf("%d ",table[i][j]);}printf("\n");}
}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; //在n行coL列摆放皇后flag[col] = false; //宣布占领第coL列d1[n-col+7] = false; //占领两个对角线d2[n+col] = false;if(n < 7) //8个皇后没有摆完,递归摆放下一行里面的皇后gernerate(n+1);elseprint(); //N=7,皇后都放完了,打印结果//回溯:考虑其它的可行方案flag[col] = true;d1[n-col+7] = true;d2[n+col] = true;}}
}
运行结果: