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;    

}

 

你可能感兴趣的:(Crash)