2011年8月11日 星期四

c082: Mutant Flatworld Expolrers

內容 :
    給你一塊矩形土地的長寬,再依序給定每個機器人的初始位置狀況及一連串的指令集,你必須用你的程式求出每個機器人最後的位置狀況。
    一個機器人的位置狀況包括了其坐標( 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 個字元長。

輸出說明 :
    對於每一個機器人,你都必須輸出其最後所在的坐標和面對的方向。如果一個機器人會掉落出此世界外,你必須先輸出他在掉落前,最後的所在位置和面對的方向,再多加一個字: 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

出處 :
    ACM 118

程式碼 :
#include<stdio.h>
#include<string.h>

char where(int direction)
{
    switch(direction)
    {
        case 0:
            return 'E';
        case 1:
            return 'S';
        case 2:
            return 'W';
        case 3:
            return 'N';
    }
}

int main()
{   
    int i,j,len,boundx,boundy,locatex,locatey,nextx,nexty,direction,map[51][51];
    char d,s[101];
    
    scanf("%d %d",&boundx,&boundy);
    
    for(i=0; i<50; i++)
        for(j=0; j<50; j++)
            map[i][j] = 1;
    
    while(scanf("%d %d %c",&locatex,&locatey,&d)==3)
    {
        
        scanf("%s",s);
        len = strlen(s);
        
        if(d == 'E')
            direction = 0;
        else if(d == 'S')
            direction = 1;
        else if(d == 'W')
            direction = 2;
        else if(d == 'N')
            direction = 3;
        
        for(i=0; i<len; i++)
        {
            if(s[i] == 'L')
                direction = (direction + 3) % 4;
            else if(s[i] == 'R')
                direction = (direction + 1) % 4;
            else
            {
                nextx = locatex;
                nexty = locatey;
                
                switch(direction)
                {
                    case 0:
                        nextx++;
                        break;
                    case 1:
                        nexty--;
                        break;
                    case 2:
                        nextx--;
                        break;
                    case 3:
                        nexty++;
                        break;
                }
               
                if(nextx<0 || nexty<0 || nextx>boundx || nexty>boundy)
                {
                    if(map[nextx][nexty] == 1)
                    {
                        map[nextx][nexty] = 0;                    
                        break;
                    }                    
                }
                else
                {
                    locatex = nextx;
                    locatey = nexty;
                }
            }
        }
        if(i == len)
            printf("%d %d %c\n",locatex,locatey,where(direction));
        else
            printf("%d %d %c LOST\n",locatex,locatey,where(direction));
        
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=c082

沒有留言:

張貼留言