c082. Mutant Flatworld Expolrers
http://zerojudge.tw/ShowProblem?problemid=c082
內容 :
給你一塊矩形土地的長寬,再依序給定每個機器人的初始位置狀況及一連串的指令集,你必須用你的程式求出每個機器人最後的位置狀況。
一個機器人的位置狀況包括了其坐標( x 坐標, y 坐標),和它面向的方向(用 N , S , E , W 來分別代表北、南、東、西)。至於一個機器人所收到的指令集,是一個由字母 ' L ' , ' R ' , 和 ' F ' 所構成的字串,其分別代表:
- 左轉(Left):機器人在原地往左轉 90 度。
- 右轉(Right): 機器人在原地往右轉 90 度。
- 前進(Forward): 機器人往其面向的方向向前走一格,且不改變其面向之方向。
從坐標 (x,y) 走至 (x,y+1) 的這個方向我們定義為北方。
因 為此矩形土地是有邊界的,所以一旦一個機器人走出邊界掉落下去,就相當於永遠消失了。不過這個掉下去的機器人會留下「標記 ( scent ) 」,提醒以後的機器人,避免他們從同一個地方掉下去。掉下去的機器人會把標記,留在他掉落之前所在的最後一個坐標點。所以對於以後的機器人,當他正位在有 標記的地方時,這個機器人就會忽略會讓他掉下去的指令。
輸入說明
:
輸入裡的第一列有2個正整數,代表這個矩形世界右上角頂點的坐標,其中假設這個世界的左下角頂點坐標為 ( 0 , 0 )。
接 下來是若干組有關機器人的初始位置狀況和指令集,每個機器人2列。第一列為位置狀況,包括了兩個整數和一個字元( N , S , E 或 W ),代表機器人初始的位置坐標以及機器人最初所面對的方向。第二列則是指令集,是一個由 ' L ' , ' R ' 和 ' F ' 所組成的字串。輸入以 end-of-file 作為結束。
各機器人是依序動作的,也就是說,直到一個機器人作完他全部的動作,下一個機器人才會開始動作。
所有機器人的初始位置皆會在矩形土地上,不會落在外面。任何坐標的最大值皆不會超過 50 。每個指令集的長度皆不會超過 100 個字元長。
輸出說明
:
範例輸入 :
5 3 1 1 E RFRFRFRF 3 2 N FRRFLLFFRRFLL 0 3 W LLFFFLFLFL
範例輸出 :
1 1 E 3 3 N LOST 2 3 S
提示
:
出處
:
作法 : 模擬
我這輩子大概跟模擬題有仇
/**********************************************************************************/
/* Problem: c082 "Mutant Flatworld Expolrers" from ACM 118 */
/* Language: C */
/* Result: AC (2ms, 286KB) on ZeroJudge */
/* Author: morris1028 at 2011-06-13 20:51:07 */
/**********************************************************************************/
#include<stdio.h>
main() {
int n, m;
while(scanf("%d %d", &n, &m) == 2) {
int Map[51][51] = {}, x, y, a;
char D[2], s[101];
while(scanf("%d %d %s %s", &x, &y, D, s) == 4) {
int lost = 0, face;
switch(D[0]) {
case 'N':face = 0;break;
case 'E':face = 1;break;
case 'S':face = 2;break;
default:face = 3;
}
for(a = 0; s[a] && lost == 0; a++) {
switch(s[a]) {
case 'R':face = (face+1)%4;break;
case 'L':face = (face+3)%4;break;
default: {
switch(face) {
case 0:y++;break;
case 1:x++;break;
case 2:y--;break;
default:x--;
}
if(x < 0 && Map[x+1][y] == 0) {
lost = 1, Map[x+1][y] = 1, x++;
}
if(x > n && Map[x-1][y] == 0) {
lost = 1, Map[x-1][y] = 1, x--;
}
if(y < 0 && Map[x][y+1] == 0) {
lost = 1, Map[x][y+1] = 1, y++;
}
if(y > m && Map[x][y-1] == 0) {
lost = 1, Map[x][y-1] = 1, y--;
}
}
}
if(x < 0) x++;
if(y < 0) y++;
if(x > n) x--;
if(y > m) y--;
}
switch(face) {
case 0:face = 'N';break;
case 1:face = 'E';break;
case 2:face = 'S';break;
default:face = 'W';
}
if(lost)
printf("%d %d %c LOST\n", x, y, face);
else
printf("%d %d %c\n", x, y, face);
}
}
return 0;
}