八皇后(C语言版)
问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,
即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
思路:
8*8的象棋盘 要放8个皇后 一行只能放一个皇后 每一个皇后放下后它所占的行、列、上对角线、下对角线都不能再放皇后
通过 行-列+7(n-col+7)划出15(0~14)条上对角线
通过行+列(n+col )划出15(0~14)条下对角线
对角线可以自己在纸上画一个8 * 8的棋盘标出下标,然后画对角线
用place[]存储皇后的位置,如 place[0]=1;表示第0行的皇后在第一列(从0开始计数)
用flag[]标记列是否可以占据 如:flag[col]=1表示第col列可以放皇后
用d1[]标记第i条上对角线是否可以放皇后
用d2[]标记第i条下对角线是否可以放皇后
代码如下:
#include<stdio.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; //统计解的数量
//函数声明
void print();//打印
void gernerate(int n);//寻找第n个皇后的位置(第n个皇后就在第n行,即寻找皇后的列)
int main(){
gernerate(0);
return 0;
}
//函数定义
void print(){//打印函数
int n,i,j;
number++;
printf("NO.%d\n",number);
int table[8][8]={0};//初始化打印的棋盘
for(n=0;n<8;n++){//循环把place[]中的8个皇后的位置 赋给棋盘
table[n][place[n]]=1;
}
for(i=0;i<8;i++){
for(j=0;j<8;j++){
printf("%d ",table[i][j]);
}
printf("\n");
}
}
void gernerate(int n)//接收第n个皇后(也就是第n行)
{
int col;
for(col=0;col<8;col++)//每行有8列
{
if(flag[col]&&d1[n-col+7]&&d2[n+col])//判断列、上对角线、下对角线是否都满足可占据
{
place[n]=col;//第n个皇后放在第n行第col列
flag[col]=0;//col列已被占据
d1[n-col+7]=0;//第n-col+7条上对角线被占据
d2[n+col]=0;//第n+col条下对角线被占据
if(n<7)//如果8个皇后还没放完 则 放下一个皇后
{
gernerate(n+1);
}
else//8个皇后已经放完
{
print();//打印
}
//回溯 考虑其他的可行方案
flag[col]=1;
d1[n-col+7]=1;
d2[n+col]=1;
}
}
}
若有不足或建议欢迎评论区留言指出!