AcWing 844. 走迷宫(BFS)

这篇博客介绍了使用C++和Python两种编程语言实现广度优先搜索(BFS)算法来解决网格地图中最短路径问题。代码中详细展示了如何初始化队列、设置边界条件并扩展搜索方向,最终找到从起点到终点的最短距离。
摘要由CSDN通过智能技术生成

 

C++

#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

typedef pair<int,int> PII;

const int N=110;

int n,m;
int g[N][N]; //g数组存地图
int d[N][N]; //d数组存每一个点到起点的距离
PII q[N*N];  //定义一个队列,记录走过的路径

int bfs()
{
    int hh=0,tt=0;   //初始化队列,对头队尾都是0
    q[0]={0,0};
    
    memset(d,-1,sizeof d);  //把所有距离初始为-1
    d[0][0]=0;   //距离是0表示已经走过了
    
    int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};   //用向量的形式表示往四个方向扩展
    
    while(hh<=tt){  //队列不空
        auto t = q[hh++];  //auto自动类型判断,用于对象声明  //每次取出队头元素
        
        for(int i=0;i<4;i++)  //四个方向
        {
            int x=t.first+dx[i],y=t.second+dy[i];   //x表示沿着这个方向走,可以走到哪个点
            if(x>=0 && x<n && y>=0 && y<m && g[x][y]==0 && d[x][y]==-1)   //在边界内&&当前点是0&&当前点没有被搜过。bfs是第一次搜到的点才是最短距离。
            {
                d[x][y]=d[t.first][t.second]+1;   //stl的pair类型容器,每个容器装两个量(可自定义),第一个是.first,第二个是.second
                q[++tt]={x,y};
            }
        }
    }
    return d[n-1][m-1];  //输出右下角这个点的距离
}

int main()
{
    cin>>n>>m;
    
    for (int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            cin >> g[i][j];
        
    cout << bfs() <<endl;
    
    return 0;    
    
}

Python

def bfs():
    q=[[0,0] for _ in range(m*n)]    #q记录走过的路径
    hh=tt=0
    dx=[-1,0,1,0]    #向量表示往四个方向走
    dy=[0,1,0,-1]
    while hh<=tt:    #队列不为空
        t=q[hh]      #取出队头元素
        hh+=1
        for i in range(4):    #从当前点出发往四个方向走
            x=t[0]+dx[i]      #即将走的点的坐标
            y=t[1]+dy[i]
            if (x<n and x>=0 and y<m and y>=0 and d[x][y]==0 and ditu[x][y]==0):
                #即将走的点 在范围内 and 没走过 and 在地图上可以走
                d[x][y]=d[t[0]][t[1]]+1   #记录该点的距离
                tt+=1
                q[tt]=[x,y]     #存入走过的路径列表
    return d[n-1][m-1]   
if __name__=='__main__':
    n,m=map(int,input().split())
    ditu=[list(map(int,input().split())) for _ in range(n)]   #存地图
    d=[[0]*m for _ in range(n)]   #存每一个点到起始点的距离
    print(bfs())

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值