八皇后问题详解

八皇后(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;
	}
   }
}


若有不足或建议欢迎评论区留言指出!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值