一、题目(POJ 3984)
给出一个只有0和1组成的5x5的矩阵表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
二、解题思路
迷宫问题中的最短路多用BFS,由于要输出最短路,一般可以在更新时保存前驱节点,这里使用DFS从终点寻找距离一次减一的节点,直到到达起点。
三、代码实现
1 #include<stdio.h>
2 #include<iostream>
3 #include<queue>
4 #include<stack>
5 #include<stdbool.h>
6 using namespace std;
7
8 typedef pair<int, int> P;
9 const int INF = 1000000;
10 const int max_n = 100 + 10;
11 const int max_m = 100 + 10;
12 int n, m;
13 int sx, sy, ex, ey;
14 int dis[max_n][max_m];
15 int dx[] = { -1,0,1,0 }, dy[] = { 0,1,0,-1 };
16 int maze[max_n][max_m + 1];
17 bool vis[max_n][max_m + 1];
18 stack<P>s;
19
20 int bfs()
21 {
22 queue<P>que;
23 for (int i = 0; i < n; i++)
24 for (int j = 0; j < m; j++)
25 dis[i][j] = INF;
26 dis[sx][sy] = 0;
27 que.push(make_pair(sx, sy));
28 while (!que.empty())
29 {
30 P p = que.front();
31 que.pop();
32 int xx = p.first; int yy = p.second;
33 if (xx == ex && yy == ey) break;
34
35 for (int i = 0; i < 4; i++)
36 {
37 int nx = xx + dx[i]; int ny = yy + dy[i];
38 if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] == 0 && dis[nx][ny] == INF)
39 {
40 que.push(make_pair(nx, ny));
41 dis[nx][ny] = dis[xx][yy] + 1;
42 }
43 }
44 }
45 return dis[ex][ey];
46 }
47
48 void dfs(int x,int y)
49 {
50
51 if (x == ex && y == ey)
52 s.push(make_pair(x, y));
53
54 if (x == sx && y == sy)
55 {
56 while (!s.empty())
57 {
58 P tmp = s.top();
59 s.pop();
60 printf("(%d, %d)\n", tmp.first, tmp.second);
61 }
62 return;
63 }
64 else
65 {
66 P tmp2 = s.top();
67 //s.pop();
68 int xx = tmp2.first; int yy = tmp2.second;
69 for (int i = 0; i < 4; i++)
70 {
71 int nx = xx + dx[i]; int ny = yy + dy[i];
72 if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] == 0)
73 if (dis[nx][ny] == dis[xx][yy] - 1)
74 {
75 vis[nx][ny] = true;
76 s.push(make_pair(nx, ny));
77 dfs(nx, ny);
78
79 vis[nx][ny] = false;
80 if(!s.empty()) s.pop();
81 }
82 }
83 }
84 return;
85 }
86 void slove()
87 {
88 int res = bfs();
89 dfs(ex,ey);
90 }
91
92 int main()
93 {
94 n = 5; m = 5;
95 for (int i = 0; i < n; i++)
96 for (int j = 0; j < m; j++)
97 cin >> maze[i][j];
98
99 sx = 0; sy = 0;
100 ex = 4; ey = 4;
101 slove();
102 return 0;
103 }
来源:https://www.cnblogs.com/lfri/p/9655815.html