20181020遭遇战

今日恰逢新人加入我们NOIP备战的队伍,题目还算“友好”。第一题模拟,第二题n^2暴力+前缀和,第三题听说也很暴力。

“设置两个布尔型数组,分别记录模拟每个人走过的格子。如果两人没有相遇并且还可以跑,就让他们按照规则一直跑下去。”——《信息学奥赛课课通(C++)》

上代码:

#include<algorithm>
#include<cstring>
#include<cstdio>
int n,x1,y1,d1,x2,y2,d2;
int movex[4]={0,1,0,-1},movey[4]={1,0,-1,0};
bool book1[1001][1001],book2[1001][1001];//记录
bool stop1,stop2;
void r1(bool xyds)//小林
{
	book1[x1][y1]=1;
	int xx=x1+movex[d1],yy=y1+movey[d1];
	if(xx<0||xx>=n||yy<0||yy>=n||book1[xx][yy]){//判断越界、重复情况
		if(xyds){
			stop1=1;//走到地图边缘死胡同就停下
			return;
		}
		else d1=(d1+1)%4,r1(1);//右转
	}
	else x1=xx,y1=yy;	
}
void r2(bool xyds)//小华
{
	book2[x2][y2]=1;
	int xx=x2+movex[d2],yy=y2+movey[d2];
	if(xx<0||xx>=n||yy<0||yy>=n||book2[xx][yy]){
		if(xyds){
			stop2=1;
			return;
		}
		else d2=(d2+3)%4,r2(1);//左转
	}
	else x2=xx,y2=yy;
}
int main()
{
	//freopen("fight.in","r",stdin);
	//freopen("fight.out","w",stdout);
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++){
		memset(book1,0,sizeof(book1));
		memset(book2,0,sizeof(book2));
		stop1=0,stop2=0;//初始化
		scanf("%d%d%d%d%d%d%d",&n,&x1,&y1,&d1,&x2,&y2,&d2);
		if(x1==x2||y1==y2) printf("%d %d\n",x1,y1);//特判,当两人开始时就在同一点,则直接输出
		else{
			for(;;){//一直跑下去!!!
				if(!stop1) r1(0);
				if(!stop2) r2(0);
				if(stop1&&stop2){
					printf("-1\n");//都凉了
					break;
				}
				if(x1==x2&&y1==y2){//碰上了
				    printf("%d %d\n",x1,y1);
				    break;
				}
			}
		}
	}
	return 0;
}

  

posted @ 2018-10-20 14:31  轩辕东升  阅读(562)  评论(0编辑  收藏  举报