poj1573 Robot Motion(DFS)
题目链接
http://poj.org/problem?id=1573
题意
一个机器人在给定的迷宫中行走,在迷宫中的特定位置只能按照特定的方向行走,有两种情况:①机器人按照方向序列走出迷宫,这时输出机器人走出迷宫的步数;②机器人在迷宫中陷入了循环,这种情况要输出机器人陷入循环前所走的步数以及循环的步数。
思路
走迷宫问题一般使用BFS或DFS求解,这里我使用DFS来求解。机器人能顺利走出迷宫的情况比较容易判断,主要是如何判断机器人陷入了循环以及陷入循环后的输出。我使用visit[r][c]来记录位置(r,c)是否被访问过,使用steps[r][c]记录机器人从起点到点(r,c)所经历的步数。假设(r,c)按照指令走了一步后的坐标为(nr,nc),若(nr,nc)已不在迷宫中,则输出结果;若(nr,nc)还在迷宫中,若该位置未被访问过,则按照指令走下一步,若(nr,nc)被访问过,则说明陷入了循环,位置(nr,nc)即是循环的起点,steps[nr][nc]-1即陷入循环前机器人所行走的步数,steps[r][c]-steps[nr][nc]+1即为循环的步数。
代码
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int N = 11; 7 char ins[N][N]; 8 int visit[N][N]; 9 int steps[N][N]; 10 int m, n, sc; 11 12 void dfs(int r, int c, int stp) 13 { 14 int nr, nc; 15 switch(ins[r][c]) 16 { 17 case 'N': 18 nr = r - 1; 19 nc = c; 20 break; 21 case 'E': 22 nr = r; 23 nc = c + 1; 24 break; 25 case 'S': 26 nr = r + 1; 27 nc = c; 28 break; 29 case 'W': 30 nr = r; 31 nc = c - 1; 32 break; 33 } 34 35 if(nr>=0&&nr<m && nc>=0&&nc<n) //还在迷宫中 36 { 37 if(!visit[nr][nc]) //(nr, nc)未被访问 38 { 39 steps[nr][nc] = stp + 1; 40 visit[nr][nc] = 1; 41 dfs(nr, nc, stp+1); 42 } 43 else //出现循环 44 { 45 printf("%d step(s) before a loop of %d step(s)\n", steps[nr][nc]-1, stp-steps[nr][nc]+1); 46 return; 47 } 48 } 49 else //走出迷宫 50 { 51 printf("%d step(s) to exit\n", stp); 52 return; 53 } 54 } 55 56 int main() 57 { 58 //freopen("poj1573.txt", "r", stdin); 59 while(cin>>m>>n>>sc && m) 60 { 61 memset(visit, 0, sizeof(visit)); 62 memset(steps, 0, sizeof(steps)); 63 64 for(int i=0; i<m; i++) 65 cin>>ins[i]; 66 67 sc--; 68 visit[0][sc] = 1; 69 steps[0][sc] = 1; 70 dfs(0, sc, 1); 71 } 72 return 0; 73 }
本站使用「CC BY-NC-SA」创作共享协议,转载请在文章明显位置注明作者及出处。