学霸的迷宫(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+记录前驱

以上是关于学霸的迷宫(BFS+记录路径)的主要内容,如果未能解决你的问题,请参考以下文章

adv147(蓝桥杯) 学霸的迷宫 bfs

算法提高 学霸的迷宫

蓝桥杯 学霸的迷宫

算法提高 学霸的迷宫

迷宫bfs+路径记录

一个深刻的经验