題目鏈接: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的知識,我把它歸類爲模擬題。