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;
}