The “eight queens puzzle” is the problem of placing eight chess queens on an
8
×
8
8×8
8×8 chessboard so that no two queens threaten each other. Thus, a solution requires that no two queens share the same row, column, or diagonal. The eight queens puzzle is an example of the more general
N
N
N queens problem of placing
N
N
N non-attacking queens on an
N
×
N
N×N
N×N chessboard. (From Wikipedia - “Eight queens puzzle”.)
Input Specification:
Each input file contains several test cases. The first line gives an integer K ( 1 < K ≤ 200 ) K (1<K≤200) K(1<K≤200). Then K K K lines follow, each gives a configuration in the format " N N N Q 1 Q_1 Q1 Q 2 Q_2 Q2 … Q N Q_N QN", where 4 ≤ N ≤ 1000 4≤N≤1000 4≤N≤1000 and it is guaranteed that 1 ≤ Q i ≤ N 1≤Q_i ≤N 1≤Qi≤N for all i = 1 , ⋯ , N i=1,⋯,N i=1,⋯,N. The numbers are separated by spaces.
Output Specification:
For each configuration, if it is a solution to the
N
N
N queens problem, print YES
in a line; or NO
if not.
Sample Input:
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
Sample Output:
YES
NO
NO
YES
Solution:
// Talk is cheap, show me the code
// Created by Misdirection 2021-08-28 17:19:19
// All rights reserved.
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int cases[1010];
bool isSolution(int n){
unordered_map<int, bool> rows, diag, rdiag;
for(int i = 1; i <= n; ++i){
if(rows[cases[i]] == true || diag[i + cases[i]] == true || rdiag[i + n + 1 - cases[i]] == true) return false;
rows[cases[i]] = true;
diag[i + cases[i]] = true;
rdiag[i + n + 1 - cases[i]] = true;
}
return true;
}
int main(){
int k;
scanf("%d", &k);
for(int i = 0; i < k; ++i){
int num;
scanf("%d", &num);
for(int j = 1; j <= num; ++j) scanf("%d", &cases[j]);
if(isSolution(num)) printf("YES\n");
else printf("NO\n");
}
return 0;
}