今日恰逢新人加入我们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; }