PAT甲级——1128 N Queens Puzzle——分数 20

题目


解法1

点击查看代码
#include <iostream>
#include <vector>
#include <unordered_set>
using namespace std;

// 对于一个皇后在 (i, Q[i]):
// 不同列已保证(因为输入默认就是按列顺序的);
// 行冲突:Q[i] 是否有重复;
// 主对角线冲突(↘):Q[i] + i 不重复;同一主对角线上的坐标和相等
// 副对角线冲突(↙):Q[i] - i 不重复;同一副对角线上的坐标差相等

int main() {
    int K; cin >> K;
    
    while (K--) {
        int N;
        cin >> N;
        vector<int> Q(N);
        for (int i = 0; i < N; ++i) {
            cin >> Q[i];
        }

        unordered_set<int> rows; // 检查行冲突
        unordered_set<int> diag1; // 检查主对角线冲突
        unordered_set<int> diag2; // 检查副对角线冲突

        bool valid = true;
        for (int i = 0; i < N; ++i) {
            int r = Q[i]; // 当前第 i 列皇后所在的行号
            if (rows.count(r) || diag1.count(r + i) || diag2.count(r - i)) {
                valid = false;
                break;
            }
            rows.insert(r);
            diag1.insert(r + i);
            diag2.insert(r - i);
        }

        cout << (valid ? "YES" : "NO") << endl;
    }
    return 0;
}


posted on 2025-04-29 11:03  LEESOL-cn  阅读(10)  评论(0)    收藏  举报

导航