PAT甲组1128 N Queens Puzzle思路解析和代码

A1128

题目链接

个人思路

解释样例:一开始图都没看明白,其实并不影响做题,还是解释一下图片吧
Figure1:序列在棋盘上的方向是从右向左的
Figure2:序列在棋盘山的方向是从下向上的

N皇后问题用dfs回溯求解,此题只是检查答案是否合理,因此比较容易一些,关键还是在于对N皇后问题的理解
行:数组的值arr[i]
列:数组下标i(已经保证不会重复)
斜率为正的斜线:行列之差为常数,为了保证相减之后不会出现负数访问越界,因此最后加上N
斜率为负的斜线:行列之和为常数
用三个vis数组表示行和两条斜线即可

个人思路代码

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2005;
int K;
//行visx,斜率为正的对角线vis1,斜率为负的对角线vis2 
bool visx[maxn], vis1[maxn], vis2[maxn];
int arr[maxn];
int main(int argc, char *argv[]) {
	scanf("%d", &K);
	while(K--)
	{
		int N;
		scanf("%d", &N);
		memset(visx, false, sizeof(visx));
		memset(vis1, false, sizeof(vis1));
		memset(vis2, false, sizeof(vis2));
		memset(arr, 0, sizeof(arr));
		bool isSolution = true;
		for(int i = 1; i <= N; ++i)
		{
			scanf("%d", &arr[i]);
			if(visx[arr[i]] == false)
				visx[arr[i]] = true;
			else
				isSolution = false;
			//正斜率,行列相减为常数;负斜率相加为常数
			int temp1 = i - arr[i] + N;
			int temp2 = i + arr[i];
			if(vis1[temp1] == true || vis2[temp2] == true)
				isSolution = false;
			else
				vis1[temp1] = vis2[temp2] = true;
		} 
		if(isSolution == false)
			printf("NO\n");
		else
			printf("YES\n");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值