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
就是皇后問題判重,判斷行重複 對角線重複就好,我寫代碼時候寫多了個判斷列重複,題目已經很明確說了列不會重複。注意的點有
- 題目給的位置標示好難受,從左下角數,我還是變成了左上角開始的數組
- 然後關於對角重複判斷,直接行標-列標就能得到一個 對角元素都一樣的值,比如從主對角線的元素 行標減列標都是0了
- 判重最快還是開個N個元素的數組,默認爲0, 有元素了就是1,沒有就是0
- 對於行標減去列標 進行對角線判重的話,使用#include <unordered_set> 可以
代碼:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_set>
using namespace std;
int main()
{
int K;
cin>>K;
for(int k=0; k<K; k++)
{
unordered_set<int> sett;
int sign=1;
int N;
cin>>N;
int setRow[N+1]={0};
int setCol[N+1]={0};
int sn[N+1][N+1]= {0};
for(int n=1; n<=N; n++)
{
//n是從左下角數的 第幾列
int m;
cin>>m;
//m是第幾行
//這表示好難受,
int trueRow=N+1-m;
int trueCol=N+1-n;
sn[trueRow][trueCol]=1;
int get=trueRow-trueCol;
if(sett.find(trueRow-trueCol)==sett.end())
sett.insert(trueRow-trueCol);
else
{
sign=0;
}
if(setRow[trueRow]==0)
setRow[trueRow]=1;
else
{
sign=0;
}
if(setCol[trueCol]==0)
setCol[trueCol]=1;
else
{
sign=0;
}
}
if(sign==1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}