一本通-例5.4 八皇后

八皇后问题(纯萌新awa)

在这里插入图片描述

大致说一下原题意:
在一个8*8棋盘上放置八个皇后,皇后之间不能互相攻击到(皇后会攻击到同一行同一列和同一个对角线上的其他皇后),问:有多少种摆法?
著名的天才数学教高斯曾经给出了76解法,也就是说,你如果能解出来77种答案,那么恭喜你,出门左拐,数奥班欢迎你。
简单用图表示一下:

在这里插入图片描述
当我们把一个皇后放在(2,2)的位置时,对角线所波及的范围也显而易见。
(3,1)(1,3)的位置都不能进行放置,也就是说我们所放下的皇后的x,y加起来,与其所波及的皇后的x+y为定值。
(1,1)(2,2)……也被波及,我们不难从其中发现一定的数学规律,没错x-y也为定值。
看到这我们不难想到这道题该如何用代码实现;开个二维数组?然后双循环?虽然在空间和时间的利用上有点大,但不过没有关系,我们先来实现一下:

#include<bits/stdc++.h>

写了头代码后…?
这题?
咋做?
显而易见,二维数组和双循环是不太可能实现。
所以我们这时就要考虑我们的dfs了。
理论存在,仙术 实践开始:

#include<bits/stdc++.h>
using namespace std;
int a[25],vh[25],d[25],dd[100],n,sum=0//此处变量记录的总共答案;
void dfs(int step){
	if(step>n){
		if(sum<3){
			for(int i=1;i<=n;i++)cout<<a[i]<<" ";cout<<endl;
		}
		sum++;
		return;//dfs中的return用以回溯
	}
	for(int i=1;i<=n;i++){
		if(!vh[i] and d[i-step+100]0==0 and dd[i+step]==0){//此处d+100目的是为了防止i-step的值为负
			a[step]=i;//下标对应的为行,下标所对应的数为列
			vh[i]=1;
			d[i-step+100]=1;
			dd[i+step]=1;
			dfs(step+1);//此处为分界点,在变量step没有超过n之前,下三行代码都不会执行
			vh[i]=0;
			d[i-step+100]=0;
			dd[i+step]=0; //这三行用以回到上一个分支点
		}
	}
}
int main(){
	cin>>n;
	dfs(1);
	cout<<sum;
	return 0;
}

ok呀,是不是非常的简单,我现在还除在发懵阶段,代码嘛,自己悟咯。
好水……

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值