https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=54
题目翻译
机器人学科、机器人动作设计、机器学习是横跨计算机科学许多分支的领域,比如人工智能、算法、电子与机械工程等等可以叫得上名的。此外,机器人(“robots”)还可以叫”turtles”(从Papert, Abelson和diSessa的工作中受到的启发),还可以叫做”beeper-pickers”(从Pattis的工作中受到启发)。Robots have been
studied and used by students as an introduction to programming for many years.
本题要求计算一个机器人在探索前哥伦比亚平面世界(?)的坐标。
给定矩形网格的尺寸和机器人的移动,你需要写一个程序计算给定机器人在一系列的指令后的最终位置。
一个机器人的位置由其在网格中的坐标(x和y)和一个方向(N,S,E,W分别表示北、南、东、西),一个机器人指令包括’L’, ‘R’, ‘F’,分别为:
1. 左转:机器人左转90°并留在当前的坐标
2. 右转:机器人右转90°并留在当前的坐标
3. 直走:机器人从当前坐标向着当前方向直走1格,方向不改变。
注意,朝北方向移动一次表示从坐标
(x,y)(0≤x,y,≤50)
移动到坐标(x,y+1)。(译者注:也就是x轴正方向朝东,y轴正方向朝北)
因为矩形网格是有界的,所以机器人超出网格边界时永远回不来了,但是超出边界的机器人将会就地(准备出界的那一格)留下“死亡信息”阻止以后的机器人从同一个位置掉出世界(虚空)。如果一个机器人下一步移动将到达留下死亡信息的格子,机器人将忽略这个移动指令。
输入
第一行两个整数,表示矩形世界最右上角的格子的坐标,左下角格子的坐标定为(0,0)。
接下来跟着一些机器人的描述信息,每个机器人两行输入,第一行2个整数表示初始坐标和一个字母(N,W,S,E)表示初始方向,第二行一个字符串表示机器人将会收到的指令序列,由’L’,’R’,’F’组成,字符之间没有空格。
程序需要按照输入给定的机器人描述的顺序模拟机器人的运动。
输入文件以EOF结束。
你可以假定所有机器人的初始坐标都在网格边界内。所有指令序列不超过100个指令。
输出
对于每一个机器人,输出一行2个数字和一个字符表示其最终移动后的坐标和方向,如果掉出了世界,在同一行另外输出”LOST”。
样例输入
5 3
1 1 E
RFRFRFRF
3 2 N
FRRFLLFFRRFLL
0 3 W
LLFFFLFLFL
样例输出
1 1 E
3 3 N LOST
2 3 S
题解
模拟就好了。
注意一些编码的技巧使得代码简化。
#include <cstring>
#include <algorithm>
#include <iostream>
#define rep(i,j,k) for(i=j;i<k;++i)
using namespace std;
bool block[64][64];
const int dx[] = { 0 , 1 , 0 ,-1 };
const int dy[] = { 1 , 0 ,-1 , 0 };
const char d[] = {'N','E','S','W'};
int main() {
int n, m, dir, nx, ny, x, y, i;
char ch;
string str;
cin >> n >> m;
while (cin >> x >> y >> ch >> str) {
rep(i,0,4) if (d[i] == ch) dir = i;
bool lost = false;
rep(i,0,str.size()) {
if (str[i] == 'L')
dir = (dir - 1 + 4) % 4;
else if(str[i] == 'R')
dir = (dir + 1) % 4;
else if(str[i] == 'F') {
nx = x + dx[dir]; // new x position
ny = y + dy[dir]; // new y position
if (nx < 0 || nx > n || ny < 0 || ny > m) {
if (block[x][y])
continue; // ignore the instruction
else {
block[x][y] = 1; // leave the scent.
lost = true; // falls off the edge of the world.
break;
}
}
x = nx; y = ny;
}
}
cout << x << " " << y << " " << d[dir];
if (lost) cout << " LOST";
cout << endl;
}
}