这是道模拟题,虽然题意很简单,但其中情况很多,所以要细心。无论如何这是我做的第一道模拟题,所以在此还是小庆祝一下
//模拟 #include<iostream> #include<cstdio> #include<cstring> using namespace std; struct { int x,y; int dirt;//方向,分别用0,1,2,3,表示,可以便于计算 }robot[101]; int A,B,N,M,K; bool map[101][101];//记录该处是否已经放置了机器人 int main() { scanf("%d",&K); bool state; int id,times; char op; while(K--) { scanf("%d%d%d%d",&A,&B,&N,&M); //读入数据 memset(map,false,sizeof(map)); for(int i=1;i<=N;i++) { scanf("%d%d %c",&robot[i].x,&robot[i].y,&op); map[robot[i].x][robot[i].y]=true; if(op=='N') robot[i].dirt=0; else if(op=='E') robot[i].dirt=1; else if(op=='S') robot[i].dirt=2; else robot[i].dirt=3; } //开始模拟 state=true;//记录到目前为止是否出现过碰撞或撞墙 while(M--) { scanf("%d %c%d",&id,&op,×); if(!state) continue; if(op=='L') robot[id].dirt=(robot[id].dirt+4-times%4)%4; else if(op=='R') robot[id].dirt=(robot[id].dirt+times)%4; //此处为向前行进的情况,分4种情况讨论(只需看其中任意一种就行,另外三种类似) else { int k; map[robot[id].x][robot[id].y]=false; if(robot[id].dirt==0) { for(int j=1;j<=times;j++) { if(robot[id].y+j>B) { printf("Robot %d crashes into the wall\n",id); state=false; break; } if(map[robot[id].x][robot[id].y+j]) { for(k=1;k<=N;k++) if(robot[k].x==robot[id].x&&robot[k].y==robot[id].y+j) break; printf("Robot %d crashes into robot %d\n",id,k); state=false; break; } } if(!state) continue; robot[id].y+=times; map[robot[id].x][robot[id].y]=true; } else if(robot[id].dirt==2) { for(int j=1;j<=times;j++) { if(robot[id].y-j<=0) { printf("Robot %d crashes into the wall\n",id); state=false; break; } if(map[robot[id].x][robot[id].y-j]) { for(k=1;k<=N;k++) if(robot[k].x==robot[id].x&&robot[k].y==robot[id].y-j) break; printf("Robot %d crashes into robot %d\n",id,k); state=false; break; } } if(!state) continue; robot[id].y-=times; map[robot[id].x][robot[id].y]=true; } else if(robot[id].dirt==1) { for(int j=1;j<=times;j++) { if(robot[id].x+j>A) { printf("Robot %d crashes into the wall\n",id); state=false; break; } if(map[robot[id].x+j][robot[id].y]) { for(k=1;k<=N;k++) if(robot[k].x==robot[id].x+j&&robot[k].y==robot[id].y) break; printf("Robot %d crashes into robot %d\n",id,k); state=false; break; } } if(!state) continue; robot[id].x+=times; map[robot[id].x][robot[id].y]=true; } else { for(int j=1;j<=times;j++) { if(robot[id].x-j<=0) { printf("Robot %d crashes into the wall\n",id); state=false; break; } if(map[robot[id].x-j][robot[id].y]) { for(k=1;k<=N;k++) if(robot[k].x==robot[id].x-j&&robot[k].y==robot[id].y) break; printf("Robot %d crashes into robot %d\n",id,k); state=false; break; } } if(!state) continue; robot[id].x-=times; map[robot[id].x][robot[id].y]=true; } } } if(state) printf("OK\n"); } return 0; }