今日恰逢新人加入我们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
",x1,y1);//特判,当两人开始时就在同一点,则直接输出
else{
for(;;){//一直跑下去!!!
if(!stop1) r1(0);
if(!stop2) r2(0);
if(stop1&&stop2){
printf("-1
");//都凉了
break;
}
if(x1==x2&&y1==y2){//碰上了
printf("%d %d
",x1,y1);
break;
}
}
}
}
return 0;
}