题意:判断给定的数据是否是n皇后的解。
解题思路:n皇后的解满足同一行,同一列,同一左对角线和同一右对角线都没有两个皇后存在。又因为题目已保证同一列满足上述条件,故只需要判断同一行,同一对角线即可。
#include <stdio.h>
#include <cstring>
#include <malloc.h>
bool map[1001][1001];
struct Node
{
int x, y;
};
bool judge(int x, int y, int m)
{
int cx, cy;
//同一行有两个皇后
for(int i = 0; i < m; i++)
if(i != y && map[x][i])
return false;
//同一右对角线
for(int i = 1; i < m; i++)
{
cx = x + i;
cy = y + i;
if(cx > m || cy > m)
continue;
if(map[cx][cy])
return false;
}
//同一左对角线
for(int i = 1; i < m; i++)
{
cx = x - i;
cy = y - i;
if(cx < 0 || cy < 0)
continue;
if(map[cx][cy])
return false;
}
return true;
}
int main()
{
int n, m, k;
scanf("%d", &n);
while(n--)
{
memset(map, 0, sizeof(map));
scanf("%d", &m);
Node *list = (Node *)malloc(sizeof(Node)*m);
for(int i = 0; i < m; i++)
{
scanf("%d", &k);
map[k-1][i] = true;
list[i].x = k-1;
list[i].y = i;
}
bool flag = true;
for(int i = 0; i < m; i++)
if(!judge(list[i].x, list[i].y, m))
{
flag = false;
break;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}