八皇后问题学习笔记

4 篇文章 0 订阅
2 篇文章 0 订阅

网课链接

 看到网课是懒猫老师-C语言-递归函数-八皇后问题(搜索,回溯)

上对角线

 所谓上对角线,就是指n-col(行号减去列号),但是我们再使用的时候为了方便,就通常采用(n-col+7),这样均为正数;
 如下图:
上对角线
 这样的斜线一共有15条;
 因此我们需要15个bool变量来表示每条对角线的状态
bool d1[14];,每一个bool值都代表一个对角线,哪个值为false就代表哪条线不能放置皇后

下对角线

 所谓下对角线,就是指n+col(行号+列号),如下图:

下对角线
 这样的斜线一共有15条;
 因此我们需要15个bool变量来表示每条对角线的状态
bool d2[14];,每一个bool值都代表一个对角线,哪个值为false就代表哪条线不能放置皇后

程序思路

Alt

完整C++代码

#include<iostream>
using namespace std;

/*8皇后问题*/
void gernerate(int num);

//四个公用变量数据初始化 
int place[8];	//第n行皇后所占位置的行号
bool flag[8] = {1,1,1,1 ,1,1,1,1};	//col列上是否可以放皇后 ,可以放置是真,不可以是假 
bool d1[14]={1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1};	//(n,col)所在上对角线上是否可以放置皇后?
bool d2[14]={1,1,1,1, 1,1,1,1, 1,1,1,1, 1,1};	//(n,col)所在下对角线上是否可以放置皇后?
int number=0;		//how many answers does the progrem have


int main(){
	gernerate(0);
	cout<<number<<endl;
	return 0;
}

void gernerate(int n){//num is the line of queen
	for(int col=0;col<8;col++) {
		if(flag[col]&&d1[n-col+7]&&d2[n+col]){
			place[n]=col;		//放置皇后 
			
			//占领col列及上下对角线 
			flag[col]=false;	
			d1[n-col+7]=false;
			d2[n+col]=false;
			
			/*如果n小于7,那么对下一行进行递归
				否则(n=7),那就是找到了一种方式来摆放
				所以number++; 
			*/
			if(n<7)
				gernerate(n+1);
			else 
				number++;
			
			//释放col列及上下对角线 
			flag[col]=true;
			d1[n-col+7]=true;
			d2[n+col]=true;
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stanford_sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值