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

#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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值