UVa 118|Mutant Flatworld Explorers|

来源:互联网 发布:php session memcached 编辑:程序博客网 时间:2024/05/21 15:50

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)(0x,y,50)移动到坐标(x,y+1)。(译者注:也就是x轴正方向朝东,y轴正方向朝北)
因为矩形网格是有界的,所以机器人超出网格边界时永远回不来了,但是超出边界的机器人将会就地(准备出界的那一格)留下“死亡信息”阻止以后的机器人从同一个位置掉出世界(虚空)。如果一个机器人下一步移动将到达留下死亡信息的格子,机器人将忽略这个移动指令。

输入

第一行两个整数,表示矩形世界最右上角的格子的坐标,左下角格子的坐标定为(0,0)。
接下来跟着一些机器人的描述信息,每个机器人两行输入,第一行2个整数表示初始坐标和一个字母(N,W,S,E)表示初始方向,第二行一个字符串表示机器人将会收到的指令序列,由’L’,’R’,’F’组成,字符之间没有空格。
程序需要按照输入给定的机器人描述的顺序模拟机器人的运动。
输入文件以EOF结束。
你可以假定所有机器人的初始坐标都在网格边界内。所有指令序列不超过100个指令。

输出

对于每一个机器人,输出一行2个数字和一个字符表示其最终移动后的坐标和方向,如果掉出了世界,在同一行另外输出”LOST”。

样例输入

5 31 1 ERFRFRFRF3 2 NFRRFLLFFRRFLL0 3 WLLFFFLFLFL

样例输出

1 1 E3 3 N LOST2 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;    }} 
原创粉丝点击