1128. N Queens Puzzle (20) n皇后站位问题——对角线坐标判断

#include
#include
#include
#include
#include
#include
#include
#include
#include
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"<

你可能感兴趣的:(PAT)