• 学霸的迷宫(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
    ",cur);
    80         print_road(n,m); //打印路径 
    81     }
    82  } 
    BFS+记录前驱
  • 相关阅读:
    javascript运算符
    javascript字符串转数字
    javascript的变量声明和数据类型
    javascript的历史和入门
    CSS中定位
    CSS中盒子模型
    CSS操作表格的边框和表格的属性示例代码
    常用的CSS样式示例代码
    CSS伪类选择器
    CSS选择器
  • 原文地址:https://www.cnblogs.com/WDKER/p/5186759.html
Copyright © 2020-2023  润新知