首页 > 代码库 > 迷宫最短路径问题
迷宫最短路径问题
问题:给定一个大小为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; }
迷宫最短路径问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。