1621. N 皇后问题
原题传送:AcWing 1621. N 皇后问题
N N N 皇后问题是指将 N N N 个皇后放置在 N × N N \times N N×N 棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
在本题中,你无需解决这一难题。
你需要做的是判断我们给出的棋子摆放是否是一种合理的摆放方案,即是否能够满足皇后之间不能相互攻击到。
为了简化棋盘的表示,让我们假设在同一列中不会放置两个皇后。
这样我们就可以用一个整数序列 Q 1 , Q 2 , … , Q N Q_1,Q_2,…,Q_N Q1,Q2,…,QN 来表示一种棋盘摆放,其中 Q i Q_i Qi 表示第 i i i 列的皇后所在的行号。
例如,下方左图的棋盘摆放可以用(4, 6, 8, 2, 7, 1, 3, 5)
来表示,它是解决八皇后问题的一种合理摆放方案。
下方右图的棋盘摆放可以用(4, 6, 7, 2, 8, 1, 9, 5, 3)
来表示,它并不是解决九皇后问题的一种合理摆放方案。
输入格式
第一行包含整数 K K K ,表示共有 K K K 组测试数据。
每组测试数据占一行,首先包含整数 N N N ,然后包含 N N N 个整数 Q 1 , Q 2 , … , Q N Q_1,Q_2,…,Q_N Q1,Q2,…,QN 。
输出格式
对于每组数据,如果是合理摆放方案,则输出 YES
,否则输出 NO
。
每个答案占一行。
数据范围
1
<
K
≤
200
1<K \le 200
1<K≤200 ,
4
≤
N
≤
1000
4 \le N \le 1000
4≤N≤1000
1
≤
Q
i
≤
N
1 \le Q_i \le N
1≤Qi≤N
输入样例:
4
8 4 6 8 2 7 1 3 5
9 4 6 7 2 8 1 9 5 3
6 1 5 2 6 4 3
5 1 3 5 2 4
输出样例:
YES
NO
NO
YES
思路:
开三个哈希表判断行、对角线和反对角线是否重复。
题解:
#include<bits/stdc++.h>
using namespace std;
int k, n;
int main()
{
cin >> k;
while(k--)
{
int flag = 0;
cin >> n;
unordered_map<int, int> r, dg, udg;
for(int i = 1; i <= n; i++)
{
int x;
cin >> x;
if(r[x] || dg[i + x] || udg[i - x])
{
flag = 1;
}
else
{
r[x] = 1;
dg[i + x] = 1;
udg[i - x] = 1;
}
}
if(flag)
cout << "NO" << endl;
else
cout << "YES" << endl;
}
return 0;
}