#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<stack>
#include<vector>
#include<queue>
#include<string>
#include<map>
using namespace std;
//21min
//耗时于思路
/*************************
题意:给出n皇后的站位,判断站位是否不冲突。
*************************/
/************************
求解要点:由于N=1000,查询要100次,若用暴力判断,N*N*M易超时
实际上可以当输入排列位置时就能进行判断
★每条左下方向斜线的坐标满足i+j相等
★每条右下方向斜线的坐标满足i-j相等(为了不为负,多加个偏移量)
每次输入一个位置,将其加入所处的行线、列线、左下线、右下线的
若某个线大于1,说明已经冲突,flag置false.
************************/
/***********************
*********************/
#define INF 0xfffffff //int32位,去除首位符号位,最大为该值
#define M 3000
int n,m;
int row[M],ldown[M],rdown[M];
int main()
{
int i,j;
int m,n,c;
scanf("%d",&m);
bool flag;
while(m--)
{
scanf("%d",&n);
memset(row,0,sizeof(row));
memset(ldown,0,sizeof(ldown));
memset(rdown,0,sizeof(rdown));
flag=true;
for(i=1;i<=n;i++)
{
scanf("%d",&c);
row[c]++;
ldown[c+i]++; //左下斜线,一条线上的坐标满足c+i相等
rdown[i-c+n]++; //右下斜线,一条线上的坐标满足c-i相等
if(row[c]>1 || ldown[c+i]>1 || rdown[i-c+n]>1)
{
flag=false;
}
}
if(flag==true)
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
1128. N Queens Puzzle (20) n皇后站位问题——对角线坐标判断
最新推荐文章于 2024-07-27 22:04:48 发布