挑战程序设计竞赛-2.1最基础的“穷竭搜索”-宽度优先搜索-迷宫的最短路径

给定一个大小为N*M的迷宫,由通道('.')和墙壁('#')组成,其中通道S表示起点,通道G表示终点,每一步移动可以达到上下左右中不是墙壁的位置。试求出起点到终点的最小步数。

(N,M<=100)

样例输入:

10 10

#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#

 
样例输出:

22

 

代码:

 1 /*
 2 * 给定一个大小为N x M的迷宫。迷宫由通道和墙壁组成,每一步可以像邻接的上下左右四格的通道移动。
 3 * 请求出从起点到终点所需的最小步数
 4 * 
 5 */
 6 
 7 #include <cstdio>
 8 #include <algorithm>   //包含pair
 9 #include <queue>
10 
11 using namespace std;
12 
13 const int INF = 2 << 27;
14 typedef pair<int, int> p;
15 
16 char maze[110][110];
17 int d[110][110];   //到各个点的距离
18 
19 int n, m;
20 int sx, sy,ex,ey;
21 
22 int dx[4] = { -1,0,1,0 }, dy[4] = { 0,-1,0,1 };
23 
24 //求(sx,sy)到(ex,ey)的最短距离
25 //如果无法到达,则是INF
26 
27 int bfs() {
28 
29 
30     for(int i = 0; i < n;i++)
31         for (int j = 0; j < m; j++) {
32             d[i][j] = INF;
33 
34     }
35 
36     queue<p> que;
37     que.push(p(sx, sy));
38     
39     d[sx][sy] = 0;
40 
41 
42     while (que.size()) {
43 
44         p p1 = que.front();
45         que.pop();
46 
47         //如果取出的点就是终点,直接退出
48         if (p1.first == ex && p1.second == ey)
49             break;
50 
51         int nx, ny;
52         for (int i = 0; i < 4; i++) {
53             nx = p1.first + dx[i], ny = p1.second + dy[i];
54             
55             if (nx < n && nx >= 0 && ny < m && ny >= 0 && maze[nx][ny] != '#' && d[nx][ny] == INF) {
56                 que.push(p(nx, ny));   //将没有被访问(不为INF)和可以到达(不为 #)的点加入队列
57                 d[nx][ny] = d[p1.first][p1.second] + 1;
58                 
59             }
60         }
61     }
62     return d[ex][ey];
63 }
64 
65 
66 int main() {
67 
68 
69     scanf("%d %d", &n, &m);
70 
71     getchar();
72     for (int i = 0; i < n; i++) {
73         for (int j = 0; j < m; j++) {
74             char ch = getchar();
75             if (ch == 'S') {
76                 sx = i;
77                 sy = j;
78             }else if(ch == 'G'){
79                 ex = i;
80                 ey = j;
81             }
82             maze[i][j] = ch;
83         }
84         getchar();
85     }
86 
87     int res = bfs();
88 
89     if (res != INF)
90         printf("%d\n", res);
91     else
92         puts("INF");
93         
94     return 0;
95 }

 

posted @ 2017-03-06 20:25  陈煜弘  阅读(332)  评论(0编辑  收藏  举报