学习的视频:懒猫老师
代码:
编译: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);
else
print(); //N=7,皇后都放完了,打印结果
//回溯:考虑其它的可行方案
flag[col] = true;
d1[n-col+7] = true;
d2[n+col] = true;
}
}
}
运行结果: