学霸的迷宫(BFS+记录路径)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学霸的迷宫(BFS+记录路径)相关的知识,希望对你有一定的参考价值。
1 //求从(sx.sy)到(gx.gy)的最短距离; 2 3 #include<iostream> 4 #include<cstdio> 5 #include<cstdio> 6 #include<queue> 7 #include<cstring> 8 #define INF 99999999 9 10 using namespace std; 11 12 typedef pair<int, int > P; //数对,记录位置 13 int n,m,cur;//规模大小 14 int sx,sy;//起点坐标 15 int gx,gy;//终点坐标 16 int dis[501][501];///到各个位置的最短距离的数组; 17 int maze[501][501];//表示迷宫 18 int dx[4]={1,0,-1,0}; // 四个方向的向量 19 int dy[4]={0,1,0,-1}; //四个方向的向量 20 struct node{ 21 int x,y; 22 }pre[501][501]; //记录前驱 23 24 25 int bfs() //广度搜索 26 { 27 queue<P> que; 28 for(int i=1;i<=n;i++) 29 for(int j=1;j<=m;j++) 30 dis[i][j]=INF; 31 que.push(P(1,1));//将起点加入队列 32 dis[1][1]=0; //加进队列距离有了,代表访问了 33 34 //不断循环直到队列的长度为0 35 while(que.size()) 36 { 37 P p=que.front(); que.pop(); 38 if(p.first==n&&p.second==m) 39 break; 40 for(int i=0;i<4;i++) //四个方向访问 41 { 42 int nx=p.first+dx[i],ny=p.second+dy[i]; //代表即将访问的点 43 44 if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&maze[nx][ny]==0&&dis[nx][ny]==INF) 45 { 46 que.push(P(nx,ny)); dis[nx][ny]=dis[p.first][p.second]+1; //符合条件加入队列 47 pre[nx][ny].x=p.first; pre[nx][ny].y=p.second; //记录前驱 48 } 49 50 } 51 } 52 return dis[n][m]; 53 54 } 55 void print_road(int x,int y) //写出前驱 56 { 57 if(pre[x][y].x==-1) 58 return ; 59 print_road(pre[x][y].x,pre[x][y].y); 60 if(x==pre[x][y].x&&y>pre[x][y].y) 61 printf("R"); 62 else if(x>pre[x][y].x&&y==pre[x][y].y) 63 printf("D"); 64 else if(x<pre[x][y].x&&y==pre[x][y].y) 65 printf("U"); 66 else if(x==pre[x][y].x&&y<pre[x][y].y) 67 printf("L"); 68 } 69 int main() 70 { 71 //int n,m; 72 while(~scanf("%d%d",&n,&m)) 73 { 74 pre[1][1].x=pre[1][1].y=-1; 75 for(int i=1;i<=n;i++) 76 for(int j=1;j<=m;j++) 77 scanf("%1d",&maze[i][j]); 78 cur=bfs(); 79 printf("%d\n",cur); 80 print_road(n,m); //打印路径 81 } 82 }
以上是关于学霸的迷宫(BFS+记录路径)的主要内容,如果未能解决你的问题,请参考以下文章