您的位置:首页 > 其它

POJ 2632--Crashing Robots

2017-10-07 14:34 351 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: