洛谷—P1219 [USACO1.5]八皇后 Checker Challenge题解

题目:P1219 [USACO1.5]八皇后 Checker Challenge
题目大意: 在n*n的棋盘上放棋子,要求所有的棋子不在同一行,同一列和同一对角线上,问有多少种放法,并输出前三种情况。
解题思路: 假如我们放第i个棋子,这个棋子假设放在第i行,那么这个棋子要满足什么条件才可以放下去?是不是要满足棋子不在同一行,同一列和同一对角线上这一条件?那么我们如何得知是不是满足条件呢?很简单,用数组表示状态。我们用三个数组分别表示列(a)的状态,左下到右上的对角线(b)的状态,左上到右下的对角线(c)的状态。列很好表示,假如这个棋子放在了第i行第j列,只要将b[j]的值置为1即可,表示第j列已经放了棋子。我们再来看看左下到右上的对角线(b),我们可以发现左下到右上的对角线的i+j是一个固定值,我们只要把b[i+j]的值置为1即可,表示这条对角线已经有棋子放下。我们再来看看左上到右下的对角线(c),发现左上到右下的对角线的i-j+n是一个固定值,我们只要把c[i-j+n]的值置为1即可,表示这条对角线已经有棋子放下。
代码:

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1000;
int n,a[maxn], diagonal1[maxn], diagonal2[maxn],col[maxn],sum;
void dfs(int index) {
	if (index == n + 1) {
		sum++;
		if (sum <= 3) {
			for (int i = 1; i <= n; i++) {
				cout << a[i] << " ";
			}
			cout << endl;
		}
		return;
	}
	for (int i = 1; i <= n; i++) {
		if (!col[i]&&(!diagonal1[index+i]&&!diagonal2[index-i+n])) {
			col[i]=1;//表示的是列
			diagonal1[i+index]=1;//表示的是左下到右上的对角线
			diagonal2[index-i + n] = 1;//表示的是左上到右下的对角线;
			a[index] = i;//放下棋子
			dfs(index + 1);//递归回溯
			a[index] = 0;
			col[i] = 0;
			diagonal1[i + index] = 0;
			diagonal2[index-i + n] = 0;
		}
	}
}
int main() {
	cin >> n;
	dfs(1);
	cout << sum << endl;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值