POJ2632 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;    
}
原文地址:https://www.cnblogs.com/Lyush/p/2570416.html