迷宫的最短路径
2014-11-12 23:42
197 查看
/* 虽然在网上找不到题目,但这题实在是太经典了,好多搜索题目都是从它变形来的 从S走到G,'#'不能走 测试数据 10 10 #S######.# ......#..# .#.##.##.# .#........ ##.##.#### ....#....# .#######.# ....#..... .####.###. ....#...G# */ #include<stdio.h> #include<iostream> #include<queue> using namespace std; const int INF=100000000; #define MAX_N 105 #define MAX_M 105 //使用pair表示状态时,使用typedef会更加方便一些 typedef pair<int,int> P; char maze[MAX_N][MAX_M+1]; //表示迷宫的数组 M+1存储'\0' int N,M; int sx,sy; //起点坐标 int gx,gy; //终点坐标 int d[MAX_N][MAX_M]; //到各个位置的最短距的数组 //4个方向移动的向量 int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1}; //求从(sx,sy)到(gx,gy)的最短距离 //如果无法到达,则是INF int bfs() { queue<P> que; //把所有位置都初始化为INF int i,j; for(i=0;i<N;i++) { for(j=0;j<M;j++) d[i][j]=INF; } //将起点加入队列,并把这一地点的距离设置为0 que.push(P(sx,sy)); d[sx][sy]=0; //不断循环直到队列的长度为0 while(que.size()) { //从队列的最前端取出元素 P p=que.front();que.pop(); //如果取出的状态已经是终点,则结束搜索 if (p.first==gx && p.second ==gy) break; //四个方向的循环 for(i=0;i<4;i++) { //移动之后位置记为nx,ny int nx=p.first + dx[i],ny = p.second+dy[i]; //判断是否可以移动以及是否已经访问过(d[nx][ny]!=INF即为已经访问过) if (0<=nx && nx<N && 0 <= ny && ny <M && maze[nx][ny]!='#' && d[nx][ny]==INF) { //可以移动的话,则加入到队列,并且到该位置的距离确定为到p的距离为+1 que.push(P(nx,ny)); d[nx][ny]=d[p.first][p.second]+1; } } } return d[gx][gy]; } void solve() { int res=bfs(); printf("%d\n",res); } int main() { #ifndef ONLINE_JUDGE freopen("in.txt","r",stdin); #endif while(scanf("%d%d",&N,&M)!=EOF) { int i,j; for(i=0;i<N;i++) { scanf("%s",maze[i]); } for(i=0;i<N;i++) { for(j=0;j<M;j++) { if (maze[i][j]=='S') sx=i,sy=j; if (maze[i][j]=='G') gx=i,gy=j; } } solve(); } return 0; }
相关文章推荐
- 求解迷宫问题的所有路径及最短路径程序
- 迷宫最短路径
- 【数据结构】求多出口带环迷宫的最短路径
- 迷宫的最短路径-BFS算法
- 迷宫最短路径问题(ShortestPath)的求解——利用链式队列
- POJ 3984 迷宫问题【迷宫最短路径 bfs】
- 迷宫的最短路径
- 迷宫问题(求最短路径)
- 走迷宫(回溯、深搜)求路径长度/最短路径表
- 编程算法 - 迷宫的最短路径 代码(C++)
- [数据结构]求解迷宫最短路径问题
- c语言迷宫最短路径
- 51nod1459 迷宫游戏(相当于最短路径,含2个权值)
- 迷宫问题,最短路径
- poj 3984迷宫问题(bfs求最短路径 类似并查集保存上个节点 保存最短路径)
- ACM-迷宫的最短路径(bfs版)
- 仙岛求药(迷宫寻找最短路径)DFS
- 迷宫的最短路径
- POJ 3984 迷宫问题(BFS:迷宫最短路径且输出路径)
- 035_迷宫最短路径