BFS(广度优先搜索)

BFS(Breadth-First Search,广度优先搜索)的核心思路可以用一句话概括:
按“层级”逐层向外扩展搜索节点,直到找到目标或遍历完所有节点。

核心思想
使用队列(Queue)维护待访问节点的顺序。

  • 先进先出的特性确保按照“层级”访问节点。
    从起始节点出发,依次访问其所有邻居节点。
  • 再从这些邻居节点出发,访问它们的邻居节点(也就是“下一层”)。
    记录已访问节点,避免重复访问。

BFS 的基本步骤
假设用 BFS 遍历一个图或解决搜索类问题,步骤如下:

将起始节点放入队列,并标记为已访问。

当队列不为空时:

  • 弹出队首节点。
  • 检查是否满足目标条件(如是,返回结果)。
  • 将所有未访问过的邻居节点加入队列,并标记为已访问。

BFS解决迷宫最短路径问题

给定一个 n×m的二维整数数组,用来表示一个迷宫,数组中只包含 01,其中:

  • 0 表示可以走的路;
  • 1 表示不可通过的墙壁。
    最初,有一个人位于左上角 (1,1)(1,1)(1,1) 处,已知该人每次可以向 上、下、左、右 任意一个方向移动一个位置。
    请问,该人从左上角移动至右下角 (n,m)(n, m)(n,m) 处,至少需要移动多少次

题目保证:

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

输入格式

  • 第一行包含两个整数 n 和 m。
  • 接下来 n 行,每行包含 m 个整数(01),表示完整的二维数组迷宫。

输出格式

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

数据范围
1≤n,m≤100

输入样例

5 5 
0 0 1 0 0
1 0 1 0 1
0 0 0 0 0 
0 1 1 1 0 
0 0 0 1 0

输出样例
8

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e4;
typedef pair<int , int> PI;
int mp[N][N],mark[N][N],n,m;
int disk[4][2]={
    {-1,0},      
    {1,0},       
    {0,-1},      
    {0,1}        
};

#define check(x,y) (x>=0&&x<n&&y>=0&&y<m)

void bfs(int n,int m)
{   
    memset(mark,-1,sizeof mark);
    queue <PI> q;
    int start_x = 0;
    int start_y = 0;
    q.push({start_x,start_y}); 
    mark[0][0]=0;
    while(!q.empty())
    {
        PI top = q.front();   
        q.pop();
        for(int i=0;i<4;i++)
        {
            int next_x = top.first+disk[i][0];
            int next_y = top.second+disk[i][1];
            if(check(next_x,next_y)&&mark[next_x][next_y]==-1&&mp[next_x][next_y]==0)
            {
                mark[next_x][next_y] = mark[top.first][top.second]+1;
                q.push({next_x,next_y});
            }
        }
    }
    cout<<mark[n-1][m-1];
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>mp[i][j];
        }
    }
    bfs(n,m);
}

代码详解

int disk[4][2]={
    {-1,0},      
    {1,0},       
    {0,-1},      
    {0,1}        
};

初始化方向向量 上下左右
使得目标在二维数组中上下左右的移动

#define check(x,y) (x>=0&&x<n&&y>=0&&y<m)

边界定义 判断目标是否跑出(nxm)二维数组的范围

memset(mark,-1,sizeof mark);
queue <PI> q;

mark数组初始化 mark作用在于记录该位置是否走过 没有走过则为-1
定义pair类型的队列q

int start_x = 0;
int start_y = 0;
q.push({start_x,start_y});
mark[0][0]=0;

将目标初始位置放入队列

while(!q.empty())
    {
        PI top = q.front();   
        q.pop();
        for(int i=0;i<4;i++)
        {
            int next_x = top.first+disk[i][0];
            int next_y = top.second+disk[i][1];
            if(check(next_x,next_y)&&mark[next_x][next_y]==-1&&mp[next_x][next_y]==0)
            {
                mark[next_x][next_y] = mark[top.first][top.second]+1;
                q.push({next_x,next_y});
            }
        }
    }

while 作用在于广搜的开始和结束
for 作用在于对于目标4个方向开始向下搜索,满足条件就使用mark记录,步长加1并加入队列

int main()
{
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>mp[i][j];
        }
    }
    bfs(n,m);
}

主函数是对输入做一个记录形成一个地图

怎么实现的最短路径
mark[next_x][next_y] = mark[top.first][top.second]+1;
很好理解 就是下一步来源于上一步,并且走过的地方不会再走一遍,这确定了唯一性,使得到达终点路径最短

可总结一个基本模板:

int disk[][]={};   //根据实际设置方向向量
void bfs()
{
    queue<Type>q;  //根据实际设置类型
    int start;
    push(start);   //入队
    while(!q.empty)
    {
        int top = q.front();
        q.pop();   //出队
        for(){
        //方向选择
        if()       //边界条件判断
        {
                   //根据题目进行设计
        }
        }  
    }
}
<think>好的,我需要回答用户关于BFS广度优先搜索的示例代码和算法实现的问题。首先,我要确保理解用户的需求:他们希望看到一个具体的BFS实例,包括代码实现和步骤说明,并且可能需要了解BFS的应用场景。用户还提到参考了三个引用资料,其中引用了图遍历、算法原理和BFS的基本思想,这些需要整合到回答中。 首先,我应该回顾BFS的基本原理,确保正确性。根据引用[1]和[2],BFS是按层次逐层访问节点,通常用队列实现,适用于寻找最短路径和无权图的遍历。引用[3]提到BFS适用于无向图和有向图。 接下来,我需要选择一个合适的例子。常见的例子是图的遍历,比如社交网络中的层级关系或者迷宫问题。这里可能用图的邻接表表示,然后展示代码。用户需要Python代码,所以我会用Python编写示例。 然后,编写代码时需要注意队列的使用,以及访问节点的标记,避免重复访问。代码结构应该清晰,包含队列初始化、循环处理节点、遍历邻居节点等步骤。同时,需要注释解释每一步的作用。 之后,说明算法步骤,分点解释每个部分的作用,比如初始化队列、标记已访问节点、处理当前节点、遍历邻居等。这部分需要结合引用中的原理,如逐层扩展、最短路径应用等。 还要考虑相关问题的生成,用户可能需要了解BFS与DFS的区别、时间复杂度,或者应用场景如最短路径、社交网络等。根据引用内容,可以提出相关问题,比如BFS在哪些场景下更优,如何优化BFS,或者与DFS的比较。 需要确保回答符合系统级指令:行内数学公式用$...$,独立公式用$$...$$,但BFS可能不涉及太多数学公式,可能不需要。但如果有,比如层数计算,可能需要用到。不过当前例子可能不涉及,所以暂时忽略。 最后,检查引用标注是否正确,每个引用在回答中的引用位置是否自然,例如在提到BFS的基本原理或应用场景时引用对应的资料。例如,当说明BFS逐层访问时,引用[2];提到图遍历时引用[3]。 总结步骤: 1. 介绍BFS的基本原理,引用相关文献。 2. 提供一个图的示例,用邻接表表示。 3. 展示Python代码,详细注释。 4. 分步解释算法流程。 5. 列举应用场景,如最短路径、社交网络。 6. 生成相关问题,如与DFS对比、时间复杂度、优化方法等。 7. 确保所有引用标注正确,格式符合要求。</think>### BFS广度优先搜索算法实现与示例代码 #### 1. BFS基本原理 广度优先搜索BFS)是一种按层次遍历图或树的算法。从起始节点开始,逐层访问相邻节点,确保先访问所有距离为$k$的节点后再处理距离为$k+1$的节点[^2]。这种特性使其在寻找最短路径、判断图连通性等场景中非常高效[^1][^3]。 --- #### 2. BFS示例代码(Python实现) 以下是一个以无向图为例的BFS实现,目标是遍历所有节点并输出访问顺序: ```python from collections import deque def bfs(graph, start): visited = set() # 记录已访问的节点 queue = deque([start]) # 使用队列存储待访问节点 visited.add(start) while queue: node = queue.popleft() print(node, end=" ") # 输出当前节点 # 遍历当前节点的所有邻居 for neighbor in graph[node]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) # 示例图(邻接表表示) graph = { 'A': ['B', 'C'], 'B': ['A', 'D', 'E'], 'C': ['A', 'F'], 'D': ['B'], 'E': ['B', 'F'], 'F': ['C', 'E'] } # 从节点'A'开始遍历 print("BFS遍历顺序:") bfs(graph, 'A') # 输出: A B C D E F ``` --- #### 3. 算法步骤解析 1. **初始化队列和访问标记** - 使用队列`deque`存储待访问节点,起始节点`A`入队。 - `visited`集合标记已访问节点,避免重复处理。 2. **逐层处理节点** - 从队列头部取出节点(如`A`),输出并遍历其邻居(`B`和`C`)。 - 将未访问的邻居(`B`、`C`)加入队列尾部,并标记为已访问。 3. **重复直到队列为空** - 队列变为空时,说明所有可达节点均已访问。 --- #### 4. BFS典型应用场景 - **最短路径问题**:在无权图中,BFS首次访问到目标节点的路径即为最短路径。 - **社交网络层级分析**:如查找用户之间的最短关系链。 - **连通性判断**:检测图中是否存在从起点到终点的路径[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值