首页 > 其他分享 >迷宫问题之bfs

迷宫问题之bfs

时间:2023-03-18 20:46:07浏览次数:33  
标签:问题 nx int 迷宫 bfs ny qe include

先来一道简单的迷宫模板题

迷宫由 n 行 m 列的单元格组成,每个单元格要么是空地,要么是障碍物。其中1表示空地,可以走通,2表示障碍物。输出从左上角到右下角的最短路径长度。

输入

5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 1
输出

7

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef pair<int,int>PII;
int n,m;
int g[1005][1005];//图
int d[1005][1005];//记录最短路径和标记是否访问过
int dx[4]={1,0,0,-1},dy[4]={0,-1,1,0};//方向数组
int ans=0;
void bfs(){
    memset(d,-1,sizeof d);
    d[0][0]=0;//防止在起点无限兜圈
    queue<PII>qe;
    qe.push({0,0});
    while(qe.size()){
        PII t=qe.front();
        qe.pop();
        for(int i=0;i<4;i++){
            int nx=t.first+dx[i];
            int ny=t.second+dy[i];
            if(nx<0||nx>=n||ny<0||ny>m||g[nx][ny]==2||d[nx][ny]!=-1)
                continue;
            qe.push({nx,ny});
            d[nx][ny]=d[t.first][t.second]+1;
        }
    }
}
int main() {
    cin>>n>>m;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>g[i][j];
        }
    }
    bfs();
    /*
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cout<<d[i][j]<<" ";
        }
        cout<<endl;
    }
    */
    cout<<d[n-1][m-1];
    return 0;
}

 

需要输出方向字符串的迷宫。

https://www.lanqiao.cn/problems/602/learning/

思路:看了csdn一位大佬的写法,可以从下往上走,再从上往回走,这样可以顺利写出走最短路的方向字符串。

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
typedef pair<int,int>PII;
char g[30][50];
int d[30][50];
char dir[]={'D','L','R','U'};
int dx[4]={1,0,0,-1},dy[4]={0,-1,1,0};
void bfs(){

    memset(d,-1,sizeof(d));
    //d[29][49]=0;
    queue<PII>qe;
    qe.push({29,49});
    while(qe.size()){
        PII t=qe.front();
        qe.pop();
        for(int i=0;i<4;i++){
            int nx=t.first+dx[i];
            int ny=t.second+dy[i];
            if(nx<0||nx>=30||ny<0||ny>=50||g[nx][ny]=='1'||d[nx][ny]!=-1)continue;
            qe.push({nx,ny});
            d[nx][ny]=d[t.first][t.second]+1;
        }
    }
}
int main() {
    for(int i=0;i<30;i++)cin>>g[i];
    bfs();
    string ans;
    int x=0,y=0;
    while(x!=29||y!=49){
        for(int i=0;i<4;i++){
            int nx=dx[i]+x;
            int ny=dy[i]+y;
            if(nx<0||nx>=30||ny<0||ny>=50||g[nx][ny]=='1'){
                continue;
            }
            if(d[x][y]==d[nx][ny]+1){
                ans+=dir[i];
                x=nx;
                y=ny;
                break;
            }
        }
    }
    for(int i=0;i<30;i++){
        for(int j=0;j<49;j++){
            cout<<d[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<ans;
    return 0;
}

 

标签:问题,nx,int,迷宫,bfs,ny,qe,include
From: https://www.cnblogs.com/zhishikele/p/17231693.html

相关文章