hdu-1035 Robot Motion (模擬)

       題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1035 

      題目大意:機器人在一個n*m大小的網格走,每個格子的值標識下一步往哪走(NSWE 對應 上下左右)。告訴你初始位置,判斷機器人是否能走出網格,如果能走出網格輸出走過的步數,不能則會陷入循環,輸出走了多少步之後開始循環,和循環一圈的步數。

      題解:用二維字符串數組存網格數據,用二維Int數組存走到當前座標走了多少步,用一個Int變量記錄當前走了多少步,x,y表示當前座標 從起始位置開始走,每走一步都給走過的位置賦值,如果該位置值不爲0,說明之前走過機器人陷入循環,循環前走了當前位置步數- 1步,循環走了當前步數減去當前位置步數+1。 如果x或y在表格範圍之外 輸出當前步數即可。

 

      AC代碼:

#include <iostream>
#include"string.h"
using namespace std;
int n,m,s;
char maze[15][15];
int Map[15][15];
int main(int argc, char** argv) {
    while(cin>>n>>m>>s){
        if(n == 0 && m == n && s == n)    break;
        memset(Map,0,sizeof(Map));
        for(int i = 1;i<=n;i++)
            for(int j = 1;j<=m;j++)
                cin>>maze[i][j];
        Map[1][s] == 0;
        int step = 0;
        int x = 1,y = s;
        while(1){
            if(!(x>=1 && x<=n && y>=1 && y<=m)){
                printf("%d step(s) to exit\n",step);
                break;
            }
            if(Map[x][y] != 0){
                printf("%d step(s) before a loop of %d step(s)\n",Map[x][y]-1,step - Map[x][y] +1);
                break;
            }
            step++;
            Map[x][y] = step;
            if(maze[x][y] == 'S')    x++;
            else if(maze[x][y] == 'N')    x--;
            else if(maze[x][y] == 'E')    y++;
            else if(maze[x][y] == 'W')    y--;
        }
    }
    return 0;
}

    小結:題目的難點主要在於如何判斷是否進入循環,以及如何找到進入循環的前後的步數。  看其他很多人把這道題歸類爲dfs,但是感覺沒用到dfs的知識,我把它歸類爲模擬題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章