Crashing Robots
Sample Input:
一道比较复杂的模拟题,一句话:细节决定成败!
我还是没有对结构体太敏感,以后还是要多用,提高代码的效率!
代码注释说明一切:
(它很长,请你忍一下)(其实也不长)~ :
//麻烦的模拟题
#include<iostream>
#include<cstdio>
#include<Cstring>
using namespace std;
//使用结构体更加简洁!(一开始用的数组,菜菜~)
struct Robot {
int x, y;
char p;
}robot[105];
struct Ins {
int r, num;
char act;
}ins[105];
int main() {
bool flag;
int k;
cin >> k;
while (k--) {
int a, b, n, m;
cin >> a >> b >> n >> m;
int map[105][105];
memset(map, 0, sizeof(map));
for (int i = 1;i <= n;i++) {
cin >> robot[i].x >> robot[i].y >> robot[i].p;
map[robot[i].x][robot[i].y] = i;//标记每个机器人的位置
}
for (int j = 1;j <= m;j++) cin >> ins[j].r >> ins[j].act >> ins[j].num;
for (int j = 1;j <= m;j++) {
flag = false;
if (ins[j].act == 'L') {
for (int i = 1;i <= ins[j].num % 4;i++) {
//既然是重复移动,我们进行取余数操作避免不必要的重复
switch (robot[ins[j].r].p) {
case 'N':robot[ins[j].r].p = 'W';break;
case 'W':robot[ins[j].r].p = 'S';break;
case 'S':robot[ins[j].r].p = 'E';break;
case 'E':robot[ins[j].r].p = 'N';break;
}
}
}
if (ins[j].act == 'R') {
for (int i = 1;i <= ins[j].num % 4;i++) {
switch (robot[ins[j].r].p) {
case 'N':robot[ins[j].r].p = 'E';break;
case 'E':robot[ins[j].r].p = 'S';break;
case 'S':robot[ins[j].r].p = 'W';break;
case 'W':robot[ins[j].r].p = 'N';break;
}
}
}
if (ins[j].act == 'F') {
for (int i = 1;i <= ins[j].num;i++) {
//四个方向举一反四
if (robot[ins[j].r].p == 'E') {
if (robot[ins[j].r].x == a) {
/*为什么是等于 a 的时候撞墙?因为说等于 a-1 的时候会进行下面的 else 操作,
也就是说如果这时候步数走完了,最后会停在 a 处(见 else 代码),那么如果
等于 a 了呢?这不就说明了撞墙了吗?*/
cout << "Robot " << ins[j].r << " crashes into the wall" << endl;
flag = true;
break;
}
if (map[robot[ins[j].r].x + 1][robot[ins[j].r].y]) {
cout << "Robot " << ins[j].r << " crashes into robot " << map[robot[ins[j].r].x + 1][robot[ins[j].r].y] << endl;
flag = true;
break;
}
else {
map[robot[ins[j].r].x + 1][robot[ins[j].r].y] = ins[j].r;
map[robot[ins[j].r].x][robot[ins[j].r].y] = 0;
robot[ins[j].r].x++;
}
}
if (robot[ins[j].r].p == 'W') {
if (robot[ins[j].r].x == 1) {
cout << "Robot " << ins[j].r << " crashes into the wall" << endl;
flag = true;
break;
}
if (map[robot[ins[j].r].x - 1][robot[ins[j].r].y]) {
cout << "Robot " << ins[j].r << " crashes into robot " << map[robot[ins[j].r].x - 1][robot[ins[j].r].y] << endl;
flag = true;
break;
}
else {
map[robot[ins[j].r].x - 1][robot[ins[j].r].y] = ins[j].r;
map[robot[ins[j].r].x][robot[ins[j].r].y] = 0;
robot[ins[j].r].x--;
}
}
if (robot[ins[j].r].p == 'N') {
if (robot[ins[j].r].y == b) {
cout << "Robot " << ins[j].r << " crashes into the wall" << endl;
flag = true;
break;
}
if (map[robot[ins[j].r].x][robot[ins[j].r].y + 1]) {
cout << "Robot " << ins[j].r << " crashes into robot " << map[robot[ins[j].r].x][robot[ins[j].r].y + 1] << endl;
flag = true;
break;
}
else {
map[robot[ins[j].r].x][robot[ins[j].r].y + 1] = ins[j].r;
map[robot[ins[j].r].x][robot[ins[j].r].y] = 0;
robot[ins[j].r].y++;
}
}
if (robot[ins[j].r].p == 'S') {
if (robot[ins[j].r].y == 1) {
cout << "Robot " << ins[j].r << " crashes into the wall" << endl;
flag = true;
break;
}
if (map[robot[ins[j].r].x][robot[ins[j].r].y - 1]) {
cout << "Robot " << ins[j].r << " crashes into robot " << map[robot[ins[j].r].x][robot[ins[j].r].y - 1] << endl;
flag = true;
break;
}
else {
map[robot[ins[j].r].x][robot[ins[j].r].y - 1] = ins[j].r;
map[robot[ins[j].r].x][robot[ins[j].r].y] = 0;
robot[ins[j].r].y--;
}
}
}
}
if (flag) break;
}
if (!flag) cout << "OK" << endl;
}
return 0;
}