迷宫最短路径问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了迷宫最短路径问题相关的知识,希望对你有一定的参考价值。
问题:给定一个大小为N×M的迷宫。迷宫由通道和墙壁组成,每一步可以向邻接的上下左右四格的通道移动。请求出从起点到终点所需的最小步数。请注意,本题假定从起点一定可以移动到终点。
限制条件:N, M ≦100
示例输入:
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
示例输出:
22
思路:
BFS广度优先搜索
DFS利用系统栈,不用自己维护栈
BFS要自己维护一个队列
#include <stdio.h> #include <iostream> #include <queue> using namespace std; int m; int n; const int INF = 0x3f3f3f3f; char maze[100][100]; int d[100][100]; int sx, sy; int gx, gy; int dx[4] = { -1, 0, 1, 0 }; int dy[4] = { 0, 1, 0, -1 }; typedef pair<int, int> P; void bfs() { queue<P> q; q.push(P(sx, sy)); d[sx][sy] = 0; while (q.size()) { int x = q.front().first; int y = q.front().second; q.pop(); if (x == gx && y == gy) { break; } for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx >= 0 && nx < n && ny >= 0 && ny < m && maze[nx][ny] != ‘#‘ && d[nx][ny] == INF) { q.push(P(nx, ny)); d[nx][ny] = d[x][y] + 1; } } } } int main() { cin >> m >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { cin >> maze[i][j]; d[i][j] = INF; if (maze[i][j] == ‘S‘) { sx = i; sy = j; } if (maze[i][j] == ‘G‘) { gx = i; gy = j; } } } bfs(); cout << d[gx][gy]; return 0; }
以上是关于迷宫最短路径问题的主要内容,如果未能解决你的问题,请参考以下文章