AcWing 1621. N 皇后问题
原题链接
简单
作者:
RP
,
2021-04-06 22:17:33
,
所有人可见
,
阅读 400
这道题要满足行及两个对角线上的都只出现过一次,如果只考虑对角线,只能通过3/4的数据
#include <bits/stdc++.h>
using namespace std;
const int N = 2000;
int path[N];
bool dg[2*N],udg[2*N];
int row[N];
int main(){
int T;
cin>>T;
while(T--){
//每次都需要将数组恢复
memset(path,0,sizeof path);
memset(dg,0,sizeof dg);
memset(udg,0,sizeof udg);
memset(row,0,sizeof row);
int n;
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&path[i]);
row[path[i]]++;
}
bool flag = true;
for(int x=1;x<=n;x++){
int y = path[x];
if(dg[x+y]||udg[y-x+n]||row[x]>1){
//cout<<x<<" "<<y<<endl;
flag = false;
cout<<"NO"<<endl;
break;
}
dg[x+y]=udg[y-x+n]=true;
}
if(flag){
cout<<"YES"<<endl;
}
}
}