题目大意:给出N个坐标,判断这些坐标是否是N皇后问题的解。即,任意两个坐标不能在同行同列或者同一对角线上。
不在同行,即行坐标不等;不在同列,即列坐标不同;不在同对角线,要求行列坐标的和和差都不能相等。因此可以用四个map记录出现过的行号、列号、行号列号之和、行号列号之差。不用hashTable的原因是计算差的时候可能出现负数,用数组的话要分成行大于列和列大于行两种情况,稍麻烦。
AC代码:
#include <cstdio>
#include <map>
using namespace std;
int main()
{
int K;
scanf("%d", &K);
for (int i = 0; i < K; ++i)
{
int N;
scanf("%d", &N);
map<int, bool> row, col, sum, sub;
bool flag = true;
for (int j = 1; j <= N; ++j)
{
int r;
scanf("%d", &r);
if(flag)
{
if(row[r]) flag = false;
else row[r] = true;
if(col[j]) flag = false;
else col[j] = true;
if(sum[r+j]) flag = false;
else sum[r+j] = true;
if(sub[r-j]) flag = false;
else sub[r-j] = true;
}
}
if(flag) printf("YES\n");
else printf("NO\n");
}
return 0;
}
本文介绍了一种解决N皇后问题的有效算法,通过使用四个map分别记录行、列、对角线上的皇后位置,判断一组坐标是否构成有效的N皇后问题解。代码实现简洁明了,适用于快速验证解的正确性。
969

被折叠的 条评论
为什么被折叠?



