[USACO1.5]八皇后 Checker Challenge

这道题很明显就是用深度优先搜索,也就是DFS

那到底要怎么去DFS呢?

它说行,列,两条对角线不能在一起。所以DFS的行参就可以是行,再用一个数组存列,两个数组去存放两条对角线。(注:存两个对角线的要是行的2倍,要不然会数组越界

那么还有一个问题,就是每一种方法存的答案。

可以用一个a数组去存放答案

DFS的出口就是当行到达n+1如果是到n的形况下,无法统计在第n行要放的列。

首先,先判答案是不是在2种及以下,应为是在判断后ans++的。如果小于3的话那么输出答案,方案数+1,返回上一次,return ;

if(r==n+1){
	if(ans<3){
		for(int i=1;i<=n;i++) cout<<a[i]<<" ";
		cout<<endl;
	}
	ans++;
	return ;
}

后面开一个for循环,枚举每一次可以放置的位置

先判断这两个对角线还有列在上面出现没,如果出现了就continue;

如果没有,就把这一列存放在a数组里,再两个对角线和列标上1

然后去上下一层,当他返回时,也就没有在走过这里列,所以要回溯,把这些变量都表1

for(int i=1;i<=n;i++){
	if(col[i]==1||d1[r-i+n]==1||d2[r+i]==1) continue;
	a[r]=i;
	col[i]=d1[r-i+n]=d2[r+i]=1;
	dfs(r+1);
	a[r]=col[i]=d1[r-i+n]=d2[r+i]=0;
}

主函数就不用我多说了,代码见下

int main(){
	cin>>n;
	dfs(1);
	cout<<ans;
	return 0;
}

这道题就这样结束了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值