题意:就是按照题意模拟就好啦。
WA了6发,各种细节错,(但是能A了还是很高兴哈哈哈)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
int t,n,m,num,ac,a,b;
struct bbq
{
int x,y;
char f[2];
} e[105];
char s;
struct bbq1
{
bool v;
int who;
};
bbq1 vis[105][105];
map<int,char> q;
char turn (char s,int ac,char a)
{
int temp;
if(s == 'N')temp = 0;
else if(s == 'E')temp = 1;
else if(s == 'S')temp = 2;
else temp = 3;
ac %= 4;
if(a == 'L')
{
return q[(temp - ac + 4)%4];
}
else return q[(temp + ac )%4];
}
void move2(int &num,char &s,int ac)
{
if(s == 'F')
{
char temp = e[num].f[0];
if(temp == 'N')
{
e[num].y += ac;
}
else if(temp == 'E')
{
e[num].x += ac;
}
else if(temp == 'S')
{
e[num].y -= ac;
}
else e[num].x -= ac;
}
}
int move1(int num,char s,int ac)
{
int x = e[num].x,y = e[num].y;
vis[x][y].v = 0;
if(s != 'F')
{
e[num].f[0] = turn(e[num].f[0],ac,s);
return 0;
}
for (int i = 0; i < ac; i++)
{
move2(num,s,1);
x = e[num].x,y = e[num].y;
if (vis[x][y].v == 1)
{
printf("Robot %d crashes into robot %d\n",num,vis[x][y].who);
return 1;
}
else if(x <= 0||x > n||y <= 0||y > m)
{
printf("Robot %d crashes into the wall\n",num);
return 1;
}
}
vis[x][y].v = 1;
vis[x][y].who = num;
return 0;
}
int main()
{
scanf("%d",&t);
q[0] = 'N';
q[1] = 'E';
q[2] = 'S';
q[3] = 'W';
while (t--)
{
scanf("%d %d",&n,&m);
scanf("%d %d",&a,&b);
memset(vis,0,sizeof vis);
memset(e,0,sizeof e);
for (int i = 1; i <= a; i++)
{
scanf("%d %d %s",&e[i].x,&e[i].y,e[i].f);
vis[e[i].x][e[i].y].v = 1;
vis[e[i].x][e[i].y].who = i;
}
int flag = 0;
for (int i = 0; i < b; i++)
{
scanf("%d %c %d",&num,&s,&ac);
if(flag)
{
continue;
}
if(move1(num,s,ac))
{
flag = 1;
}
}
if(flag == 0)
printf("OK\n");
}
}