PAT A1128 N Queens Puzzle (20 分) 数学问题

    题目大意:给出N个坐标,判断这些坐标是否是N皇后问题的解。即,任意两个坐标不能在同行同列或者同一对角线上。

    不在同行,即行坐标不等;不在同列,即列坐标不同;不在同对角线,要求行列坐标的和和差都不能相等。因此可以用四个map记录出现过的行号、列号、行号列号之和、行号列号之差。不用hashTable的原因是计算差的时候可能出现负数,用数组的话要分成行大于列和列大于行两种情况,稍麻烦。

AC代码:

#include 
#include 

using namespace std;

int main()
{
    int K;
    scanf("%d", &K);
    for (int i = 0; i < K; ++i)
    {
        int N;
        scanf("%d", &N);
        map 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;
}


 

你可能感兴趣的:(PAT)