迷宫最短路径(宽度搜索妙解)
2013-11-17 22:21
162 查看
/* 问题描述: 迷宫的最短路径 给定N*M的迷宫,找到从起点S到终点G的最短路径长度。(默认一定可以到达终点) 输入: 10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .####.###. ....#...G# 输出: 22 */ #include<iostream> #include<queue> #define MAX 101 using namespace std; const int INF = 100000000;//一般放大2~4倍不会溢出为标准设无穷大值 //使用pair表示状态,用typedef会更方便 typedef pair<int, int> P; char maze[MAX][MAX]; int N, M; int sx, sy;//起点坐标 int gx, gy;//终点坐标 int d[MAX][MAX];//到各个位置的最短距离的数组 int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};//4个方向移动的向量 //求从(sx, sy)到(gx, gy)的最短距离,如果无法到达,则是INF int bfs() { queue<P> que; for(int i = 0; i < N; i++)for(int j = 0; j < M; j++) d[i][j] = INF; que.push(P(sx, sy)); d[sx][sy] = 0; while(que.size()) { P p = que.front(); que.pop(); if(p.first == gx && p.second == gy) break; for(int i = 0; i < 4; i++) { int nx = p.first + dx[i], ny = p.second + dy[i]; if(0 <= nx && nx < N && 0 <= ny && ny < M && maze[nx][ny] != '#' && d[nx][ny] == INF) { que.push(P(nx, ny)); d[nx][ny] = d[p.first][p.second] + 1; } } } return d[gx][gy]; } int main() { int ans; cin>>N>>M; for(int i = 0; i < N; i++) for(int j = 0; j < M; j++) { cin>>maze[i][j]; if(maze[i][j] == 'S') {sx = i; sy = j;} if(maze[i][j] == 'G') {gx = i; gy = j;} } ans = bfs(); cout<<ans<<endl; system("pause"); return 0; } /* 宽度优先搜索总结: 宽度优先按照距离开始状态由近到远的顺序进行搜索,因此可以很容易的用来求最短路径、最少操作之类的问题。 深度优先(隐式)使用栈,而宽度优先使用队列。 */
相关文章推荐
- 宽度优先搜索——迷宫的最短路径
- 白书2.1.5宽度优先搜索(迷宫的最短路径)
- 宽度搜索优先算法搜索迷宫最短距离
- 迷宫最短路径 深度优先搜索—C—python
- (广度优先搜索第一课)迷宫的最短路径 - BFS
- 找到迷宫的所有路径和最短路径-深度搜索
- 广度优先搜索迷宫的最短路径走法!
- 迷宫问题(广度优先搜索,输出最短路径)
- 迷宫:广度优先搜索求最短路径
- 《挑战程序设计比赛》 P35 题目:迷宫的最短路径 广度搜索
- BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题
- 宽度优先搜索 最短路径
- 重学搜索yi.3:迷宫的最短路径--bfs
- BFS-迷宫问题-用宽度(广度)优先搜索解决最优路径问题
- 搜索最短路径:迷宫问题 POJ - 3984
- 广度优先搜索--迷宫最短路径--队列
- 宽度搜索(BFS)中求最短路径问题理解记录
- 【搜索-广搜】 迷宫的最短路径
- 搜索入门(BFS)迷宫的最短路径
- POJ 3984 迷宫问题(记录路径的搜索)