//纯模拟 #include<iostream> #include<cstring> using namespace std; int map[101][101],A,B; struct node { char direction; int x,y; }; node robot[101]; bool judge; void F(int no,int repeat) { int i; map[robot[no].x][robot[no].y]=0; if(robot[no].direction=='N') for(i=1;i<=repeat&&(0<robot[no].y&&robot[no].y<=B)&&map[robot[no].x][robot[no].y]==0;i++) robot[no].y++; else if(robot[no].direction=='S') for(i=1;i<=repeat&&(0<robot[no].y&&robot[no].y<=B)&&map[robot[no].x][robot[no].y]==0;i++) robot[no].y--; else if(robot[no].direction=='W') for(i=1;i<=repeat&&(0<robot[no].x&&robot[no].x<=A)&&map[robot[no].x][robot[no].y]==0;i++) robot[no].x--; else for(i=1;i<=repeat&&(0<robot[no].x&&robot[no].x<=A)&&map[robot[no].x][robot[no].y]==0;i++) robot[no].x++; if(robot[no].x<=0||robot[no].x>A||robot[no].y<=0||robot[no].y>B) { printf("Robot %d crashes into the wall\n",no); judge=1; return; } if(map[robot[no].x][robot[no].y]==0) map[robot[no].x][robot[no].y]=no; else { printf("Robot %d crashes into robot %d\n",no,map[robot[no].x][robot[no].y]); judge=1; } } void L(int no,int repeat) { repeat%=4; if(repeat==1) { if(robot[no].direction=='W') robot[no].direction='S'; else if(robot[no].direction=='S') robot[no].direction='E'; else if(robot[no].direction=='E') robot[no].direction='N'; else robot[no].direction='W'; } else if(repeat==2) { if(robot[no].direction=='W') robot[no].direction='E'; else if(robot[no].direction=='S') robot[no].direction='N'; else if(robot[no].direction=='E') robot[no].direction='W'; else robot[no].direction='S'; } else if(repeat==3) { if(robot[no].direction=='W') robot[no].direction='N'; else if(robot[no].direction=='S') robot[no].direction='W'; else if(robot[no].direction=='E') robot[no].direction='S'; else robot[no].direction='E'; } } void R(int no,int repeat) { repeat%=4; if(repeat==1) { if(robot[no].direction=='W') robot[no].direction='N'; else if(robot[no].direction=='S') robot[no].direction='W'; else if(robot[no].direction=='E') robot[no].direction='S'; else robot[no].direction='E'; } else if(repeat==2) { if(robot[no].direction=='W') robot[no].direction='E'; else if(robot[no].direction=='S') robot[no].direction='N'; else if(robot[no].direction=='E') robot[no].direction='W'; else robot[no].direction='S'; } else if(repeat==3) { if(robot[no].direction=='W') robot[no].direction='S'; else if(robot[no].direction=='S') robot[no].direction='E'; else if(robot[no].direction=='E') robot[no].direction='N'; else robot[no].direction='W'; } } void zhiling(int no,char action,int repeat) { if(action=='F') F(no,repeat); else if(action=='L') L(no,repeat); else R(no,repeat); } int main() { int K,i,n,m,x,y,no,repeat; char temp[2]; scanf("%d",&K); while(K--) { memset(map,0,sizeof(map)); scanf("%d%d",&A,&B); scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d%d%s",&x,&y,temp); robot[i].x=x; robot[i].y=y; robot[i].direction=temp[0]; map[x][y]=i; } judge=0; for(i=1;i<=m;i++) { scanf("%d%s%d",&no,temp,&repeat); if(judge==0) zhiling(no,temp[0],repeat); } if(judge==0) printf("OK\n"); } }