POJ 2632--Crashing Robots

2017-10-07

原题链接

题目大意:

有一个东-西方向长A米,南-北方向长B米的仓库(0<=A,b<=100),仓库里有N个机器人,给出M条指令操纵它们(0<=N,M<=100)。输入数据第一行是一个整数K,给出测试数据的组数。接下来每组数据第一行给出A,B;第二行给出N,M;接下来N行每行两个整数表明一个机器人(编号1~N)的位置,还有一个字符表明机器人初始的朝向(W,N,E或S);再接着的M行每行第一个整数指出机器人编号,第二个字符给出指令类型(R:向当前方向右侧转90度;L:向当前方向左侧转90度;F:向当前方向前进1米),第三个整数指示这条指令的执行次数。只有一整行指令执行完才会执行下一行指令。对每一组测试数据,输出一行,如果没有机器人撞墙(试图移动到超出仓库范围的区域,输出“Robot x crashes into the wall”),或者撞到另一个机器人(总是记为正在移动的机器人撞上一个静止的机器人,输出“Robot x crashes into robot y”),输出为“OK”。

样例输入:

4
5 4
2 2
1 1 E
5 4 W
1 F 7
2 F 7
5 4
2 4
1 1 E
5 4 W
1 F 3
2 F 1
1 L 1
1 F 3
5 4
2 2
1 1 E
5 4 W
1 L 96
1 F 2
5 4
2 3
1 1 E
5 4 W
1 F 4
1 L 1
1 F 20

样例输出:

Robot 1 crashes into the wall
Robot 1 crashes into robot 2
OK
Robot 1 crashes into robot 2

这题的思路没什么特别的,就是按照题意读取输入,初始化一个“仓库”,逐条模拟指令并判断机器人的状态。个人觉得有几点要注意:
1.一定要理清题目的“东西南北”与自己模拟仓库的二维数组维度之间的对应关系;
2.指令‘R’和‘L’不改变机器人位置,仅改变其朝向,‘F’会改变机器人位置。

概括起来,,就是:

读题一定要认真!!读题千万要认真!!读题绝对要认真!!

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
#define MAX 110
using namespace std;
//记录机器人初始朝向: W-0,N-1,E-2,S-3
int warehouse[MAX][MAX];
int robotNum[MAX][2];
//四个方向对应的坐标变化(W,N,E,S),注意对应关系
int dirNS[4] = { 0, 1, 0,-1};
int dirWE[4] = {-1, 0, 1, 0};

//判断执行一次'F'指令后机器人的状态: 0-正常, 1-撞墙, 2-撞上其他机器人
int judState(int A, int B, int Xi, int& crash, int N) {
    int xx = robotNum[Xi][0];
    int yy = robotNum[Xi][1];
    int move = warehouse[xx][yy];
    int Xmove = dirWE[move] + xx;
    int Ymove = dirNS[move] + yy;
    if(warehouse[Xmove][Ymove] == -1) {
        if(Xmove == 0 || Xmove == (A+1) || Ymove == 0 || Ymove == (B+1))
            return 1;
        else
        {
            warehouse[Xmove][Ymove] = warehouse[xx][yy];
            warehouse[xx][yy] = -1;
            robotNum[Xi][0] = Xmove;
            robotNum[Xi][1] = Ymove;
        }
    }
    else //撞上其他机器人
    {
        for(int j = 1; j <= N; j++) {
            if(robotNum[j][0] == Xmove && robotNum[j][1] == Ymove) {
                crash = j;
                break;
            }
        }
        return 2;
    }

    return 0;
}

int main() {
    int K,A,B,N,M,Xi,Yi;
    char Dir;
    //K:输入样例组数
    cin >> K;
    while(K > 0) {
        memset(warehouse, -1 ,sizeof(warehouse));
        memset(robotNum, 0, sizeof(robotNum));
        //A:每组中仓库的长(数组第1维); B:每组中仓库的宽(数组第2维)
        cin >> A >> B;
        //N:机器人数目; M:指令数目
        cin >> N >> M;
        for(int i = 1; i <= N; i++) {
            //Xi,Yi:每个机器人的初始位置; Dir:每个机器人的初始朝向
            cin >> Xi >> Yi >> Dir;
            switch(Dir) {
                case 'W' : warehouse[Xi][Yi] = 0; break;
                case 'N' : warehouse[Xi][Yi] = 1; break;
                case 'E' : warehouse[Xi][Yi] = 2; break;
                case 'S' : warehouse[Xi][Yi] = 3; break;
            }
            //robotNum:记录每个机器人的编号(按出现顺序)
            robotNum[i][0] = Xi;
            robotNum[i][1] = Yi;
        }
        //记录指令执行后机器人的状态: 0-正常, 1-撞墙, 2-撞上其他机器人
        int state = 0;
        int tp1,tp3,crash;
        char tp2;
        for(int i = 0; i < M; i++) {
            cin >> tp1 >> tp2 >> tp3;
            if(state != 0) continue; //要完整地接收输入
            Xi = tp1; Dir = tp2; Yi = tp3;
            for(; Yi > 0; Yi--) {
                if(state != 0) break;
                int xx = robotNum[Xi][0];
                int yy = robotNum[Xi][1];
                switch(Dir) {
                    //* 注意:‘L’和‘R’,每步都需要转换90度 *
                    //** 注意:只有‘F’操作才会改变机器人的位置,‘L’和‘R’只改变其方向 **
                    //********** 读题 千万/一定/必须 要 认真 ************* -_-||
                    case 'L':
                        warehouse[xx][yy] = (warehouse[xx][yy] + 3) % 4;
                        break;
                    case 'R':
                        warehouse[xx][yy] = (warehouse[xx][yy] + 1) % 4;
                        break;
                    case 'F':
                        state = judState(A,B,Xi,crash,N);
                        break;
                }
            }
        }
        if(state == 0) cout << "OK" << endl;
        else if(state == 1) cout << "Robot " << Xi << " crashes into the wall" << endl; 
        else cout << "Robot " << Xi << " crashes into robot " << crash << endl;

        --K;
    }

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值