八皇后问题(dfs)

八皇后问题,是一个古老而著名的问题,是搜索算法的经典案例。该问题是国际西洋棋棋手马克思贝瑟尔于1848年提出:在8*8格的国际象棋上摆放八个皇后。使其不能相互攻击,即任意两个皇后都不能处于同一行、同一列或者同一斜线,问有多少中摆法。
在这里插入图片描述
分析:用dfs一行一行得进行摆放,用for循环来确定每一列,由于是一行一行得摆放所以不可能同行,我们只需要标记同列,同对角线,就行,会发现主对角线一条对角线上的行列和等于同一个常数,副对角线一条对角线行列差等于一个常数,只不过会是负数,防止下标是负数我们可以进行+8,保证是一个正数,利用这个性质来确定有没有同行同列

#include<iostream>
using namespace std;
bool v[10],tx[20],ty[20];//表示这一列,主对角线,负对角线有没有皇后 
int cnt=0;
bool check(int x,int y){
	return !v[y]&&!tx[x+y]&&!ty[x-y+8];//+8防止产生负数
void dfs(int x){
	if(x==8){//找到了一种摆法
		cnt++;
		return;
	}
	for(int i=0;i<8;i++){
		if(check(x,i)){
			v[i]=tx[x+i]=ty[x-i+8]=true;
			dfs(x+1);
			v[i]=tx[x+i]=ty[x-i+8]=false; 
			
		}
	}
} 
int main(){
	dfs(0);//从0行开始摆放; 
	cout<<cnt<<endl;
	return 0;
} 
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值