UVa 118|Mutant Flatworld Explorers|

31 篇文章 0 订阅

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 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;
    }
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值