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)
", steps[nr][nc]-1, stp-steps[nr][nc]+1);
46             return;
47         }
48     }
49     else    //走出迷宫
50     {
51         printf("%d step(s) to exit
", 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 }
原文地址:https://www.cnblogs.com/sench/p/7816528.html