走迷宫问题(BFS)

原题题目:

给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1表示不可通过的墙壁。

最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。

请问,该人从左上角移动至右下角 (n,m)处,至少需要移动多少次。

数据保证 (1,1)处和 (n,m)处的数字为 0,且一定至少存在一条通路。

输入格式

第一行包含两个整数 n 和 m。

接下来 n 行,每行包含 m个整数(0 或 1),表示完整的二维数组迷宫。

输出格式

输出一个整数,表示从左上角移动至右下角的最少移动次数。

数据范围

1≤n,m≤100

数据范围

1≤n,m≤100

输入样例:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
输出样例:
8
代码:
#include<bits/stdc++.h>
using namespace std;
const int N  = 110;
int n,m;
typedef pair<int,int>PII;   //定义一个结构体,存储<int,int>类型的数据
int g[N][N];            //存储图
int d[N][N];           //存储点到起点的距离
void bfs(int a,int b) //a,b为起始位置坐标
{
    queue<PII> q;    //定义一个PII类型的队列
    q.push({a,b});   //把起点放入队列
    while(!q.empty())    //判断队列是否为空
    {
        PII s = q.front();    //取队首元素放入s中
        q.pop();              //删除队首元素
        int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};    //用向量来模拟四个方向,从acwing上的y总学到的思路
        for(int i=0;i<4;i++)      //循环4个方向
        {
            int x = s.first+dx[i],y=s.second+dy[i];   //定义x,y来存储走之后的坐标
            if(g[x][y]==0)        //如果该点是0(可以走)
            {
                g[x][y]=1;         //把该点转换为1,表示走过
                d[x][y]=d[s.first][s.second]+1;      //将走过该点的下一个点到起点你的距离存到数组里,因为是下一个点,所以要加1
                q.push({x,y});     //将该点放入队列
            }
        }
        
    }
    cout<<d[n][m];   //输出离起点最近距离
    
    
    
}

int main()
{
    memset(g,1,sizeof(g));  //将数组初始化,全为一,不知道memset函数怎么用的可以去搜一下
cin>>n>>m; 
    for(int i=1;i<=n;i++)
     for(int j=1;j<=m;j++)    //把图存入数组
      cin>>g[i][j];
    bfs(1,1);   //传参,起点位置
}

一.BFS搜索路径(画的有点丑)

二.BFS能找到最短路径的原因

  1. 逐层搜索:BFS按照节点的层级顺序逐层进行搜索。从起始节点开始,首先搜索到与起始节点直接相邻的节点(第一层),然后再搜索到与这些节点相邻的节点(第二层),依次类推。由于BFS的搜索顺序是逐层的,因此当搜索到目标节点时,路径的长度一定是最短的,即最先找到目标节点的路径一定是最短路径。

  2. 无环性:BFS在搜索过程中会维护一个“已访问”节点的集合,确保每个节点只被访问一次。由于BFS的特性是先访问距离起始节点最近的节点,然后依次访问离起始节点更远的节点,所以一旦某个节点被访问过,它的最短路径就已经确定,不会再有更短的路径。这种无环性质保证了BFS找到的路径一定是最短路径。

总的来说,BFS之所以能够找到图中节点之间的最短路径,是因为它按层级逐层搜索,并且保证每个节点只被访问一次,从而确保找到的路径是最短的。(注意这个按层搜索,思考和DFS的区别)。

三.DFS与BFS的区别

  1. 搜索顺序

    • DFS:从起始节点开始,沿着一条路径一直深入直到不能再深入为止,然后回溯到最近的一个未被访问过的节点继续深入,如此往复,直到找到目标节点或者遍历完所有节点。
    • BFS:从起始节点开始,首先访问所有与起始节点相邻的节点,然后再依次访问这些相邻节点的相邻节点,以此类推,逐层进行搜索。
  2. 数据结构

    • DFS:通常使用栈(Stack)来实现,通过递归或迭代的方式实现深度优先搜索。
    • BFS:通常使用队列(Queue)来实现,按照先进先出的顺序逐层搜索。
  3. 搜索路径

    • DFS:找到一条路径后会继续深入搜索,直到遍历完整个图或者找到目标节点。
    • BFS:按层级逐层搜索,找到目标节点后即可确定最短路径。
  4. 适用情况

    • DFS:适用于寻找深度路径,例如拓扑排序、连通性检测等问题。
    • BFS:适用于寻找最短路径,例如最短路径问题、最小生成树等(一般边权要相等)。

总的来说:

DFS更适合深度优先搜索,适用于寻找深度路径和遍历整个图;

而BFS更适合广度优先搜索,适用于寻找最短路径和层级遍历。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值