【SDUT第11周周赛Problem A】SDUT2576——Queen Collisions

来源:点击打开链接

由于一些原因,需要在短短的一段时间内速成图论和搜索了=  =,希望能够有一个不错的结果。

这个题是著名八皇后问题的变种,大意就是问在一个棋盘中,照面的皇后有几组(横着竖着斜着都算)。输入需要仔细看才能看懂,王后的坐标是通过x,y的公式给的,需要算出来然后建图。

二维数组在30000的长度面前会溢出,所以转化成4个一维数组来进行判断,行、列、左上行、右下行都算上。最后总体搜过一遍,得出结果。

#include <iostream>
#include <string>
#include <cstring>
using namespace std;

int xline[30002];
int yline[30002];
int Beforex[60002];
int Beforey[60002];
//int point[30002][30002];//超了个界 

int main()
{
	int mat;
	while(cin>>mat && mat!=0)
	{
		memset(xline,0,sizeof(xline));
		memset(yline,0,sizeof(yline));
		memset(Beforex,0,sizeof(Beforex));
		memset(Beforey,0,sizeof(Beforey));
		
		int queennum,ans=0;
		cin>>queennum;
		for(int i=0;i<=queennum-1;i++)
		{
			int k,x,y,s,t;
			int nowx,nowy;
			cin>>k>>x>>y>>s>>t;
			for(int i=0;i<=k-1;i++)
			{
				nowx=x+(i*s);
				nowy=y+(i*t);
				xline[nowx]++;
			 	yline[nowy]++;
				
				
				
				Beforex[nowx+nowy]++;//左上 
				Beforey[(mat+nowy)-nowx]++;	//右下	
			}
		
		}
		
		for(int i=1;i<=mat;i++)
		{
			if(xline[i]>1)
				ans+=xline[i]-1;
			if(yline[i]>1)
				ans+=yline[i]-1;
		}
		
		for(int j=1;j<=2*mat;j++)
		{
			if(Beforex[j]>1)
				ans=ans+Beforex[j]-1;
			if(Beforey[j]>1)
				ans=ans+Beforey[j]-1;
			
		}
		cout<<ans<<endl;
	}
	return 0;
}


你可能感兴趣的:(【SDUT第11周周赛Problem A】SDUT2576——Queen Collisions)