本题的图与其他题稍有不同,本题以左下角为(0,0)点,列号对应x,行号对应y。
完全模拟即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
const int maxa = 101;
struct Robot
{
int x, y, d;
} robot[maxa];
int dir[4][2] =
{
{ 0, 1 },//e
{ -1, 0 }, //s
{ 0, -1 }, //w
{ 1, 0 } }; //n
int n, m, cx, cy;
int map[maxa][maxa];
void init()
{
memset(map, 0, sizeof(map));
cin >> cy >> cx >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> robot[i].y >> robot[i].x;
getchar();
switch (getchar())
{
case 'E':
robot[i].d = 0;
break;
case 'S':
robot[i].d = 1;
break;
case 'W':
robot[i].d = 2;
break;
case 'N':
robot[i].d = 3;
break;
}
map[robot[i].x][robot[i].y] = i;
}
}
bool forward(int a)
{
map[robot[a].x][robot[a].y] = 0;
robot[a].x += dir[robot[a].d][0];
robot[a].y += dir[robot[a].d][1];
int x = robot[a].x;
int y = robot[a].y;
if (x == 0 || x > cx || y == 0 || y > cy)
{
printf("Robot %d crashes into the wall\n", a);
return false;
}
if (map[x][y] != 0)
{
printf("Robot %d crashes into robot %d\n", a, map[x][y]);
return false;
}
map[x][y] = a;
return true;
}
bool operate(int a, char op, int times)
{
if (op == 'F')
{
for (int i = 0; i < times; i++)
if (!forward(a))
return false;
return true;
}
if (op == 'L')
robot[a].d -= times;
else
robot[a].d += times;
robot[a].d %= 4;
if (robot[a].d < 0)
robot[a].d += 4;
return true;
}
void finish(int times)
{
string st;
while (times--)
getline(cin, st);
}
void work()
{
for (int i = 0; i < m; i++)
{
int num, time;
char op;
cin >> num;
getchar();
cin >> op >> time;
getchar();
if (!operate(num, op, time))
{
finish(m - i - 1);
return;
}
}
cout << "OK\n";
}
int main()
{
//freopen("D:\\t.txt", "r", stdin);
int t;
cin >> t;
while (t--)
{
init();
work();
}
return 0;
}