POJ-2632 Crashing Robots 模拟
该题是个纯模拟题,只要仔细模拟就可以了,刚开始的时候自己按照自己的想法把行列关系进行了更改,结果弄得方向错乱。该证后AC。
代码如下:
#include <cstring> #include <cstdio> #include <cstdlib> #define MAXN 105 using namespace std; int A, B, N, M, x[MAXN], y[MAXN], d[MAXN]; int G[MAXN][MAXN]; int dir[4][2] = {-1, 0, 0, 1, 1, 0, 0, -1}; char box[MAXN]; // 接受信息 struct Message { int No, times; char op[3]; }m; bool update(int &who, int &kind) { if (m.op[0] == 'L') { // 左转 d[m.No] = (d[m.No] - m.times + 120) % 4; } else if (m.op[0] == 'R') { // 右转 d[m.No] = (d[m.No] + m.times) % 4; } else { // 前进 while (m.times--) { G[x[m.No]][y[m.No]] = 0; int xx = (x[m.No] += dir[ d[m.No] ][0]); int yy = (y[m.No] += dir[ d[m.No] ][1]); if (xx < 1 || xx > A || yy < 1 || yy > B) { kind = 1; return true; } else if (G[xx][yy] != 0) { kind = 2; who = G[xx][yy]; return true; } else { G[xx][yy] = m.No; } } } return false; } int main() { int T; bool over; char temp[3]; scanf("%d", &T); while (T--) { memset(G, 0, sizeof (G)); box[0] = 'O', box[1] = 'K', box[2] = '\0'; over = false; scanf("%d %d", &A, &B); // A 为宽,B为高 scanf("%d %d", &N, &M); // N 为机器人的个数, M为指令的条数 for (int i = 1; i <= N; ++i) { scanf("%d %d %s", &x[i], &y[i], temp); G[x[i]][y[i]] = i; switch (temp[0]) { case 'W': d[i] = 0; break; case 'N': d[i] = 1; break; case 'E': d[i] = 2; break; case 'S': d[i] = 3; break; } } while (M--) { int who, kind; scanf("%d %s %d", &m.No, m.op, &m.times); if (over) { continue; } if (update(who, kind)) { over = true; if (kind == 1) { sprintf(box, "Robot %d crashes into the wall", m.No); } else { sprintf(box, "Robot %d crashes into robot %d", m.No, who); } } } puts(box); } return 0; }