题目
![]()
解法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;
}
![]()