这是道模拟题,虽然题意很简单,但其中情况很多,所以要细心。无论如何这是我做的第一道模拟题,所以在此还是小庆祝一下
//模拟
#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;
}