BFS解题框架

BFS(Breath First Search,广度优先算法)和DFS(Depth First Search,深度优先算法)是非常常用的两种算法,其中DFS通常被认为是“回溯算法”。

BFS相对DFS的最大区别是:BFS找到的路径一定是最短的,但代价是空间复杂度比DFS大很多

BFS的核心思想:把一个问题抽象成,从一个点开始,向四周扩散。通常BFS算法都是需要“队列”这种数据结构,把一个点周围的点加入这个队列。

算法框架

int BFS(Node start, Node end) {
    Queue<Node> queue = new LinkedList<>();	// 核心数据结构
    Set<Node> visited = new HashSet<>();	// 避免走回头路

    queue.offer(start);
    visited.add(start);
    int step = 0;
    
    while (!queue.isEmpty()) {
        int size = queue.size();
        // 将当前队列中的所有点向周围扩散
        for (int i = 0; i < size; i++) {
            Node node = queue.poll();
            // 判断是否到达终点
            if (node == end) {
                return step;
            }
            // 将当前点周围的点都加入队列
            for (Node newNode : node.adj()) {
                if (!visited.contains(newNode)) {
                    queue.offer(newNode);
                    visited.add(newNode);
                }
            }
        }
        step++;
    }
    return step;
}

练习题目:

  1. Leetcode 111. 二叉树的最小深度
  2. Leetcode 752. 打开转盘锁
### 关于蓝桥杯竞赛中使用Python实现BFS解题思路 在蓝桥杯竞赛中,广度优先搜索(BFS)是一种常见的算法工具,用于解决诸如最短路径、连通分量等问题。以下是基于参考资料的内容以及专业知识整理出的关于如何利用Python实现BFS的具体方法及其应用场景。 #### 解题思路概述 BFS的核心思想是从起始节点出发,逐层扩展到其相邻节点,并记录访问状态以避免重复计算。对于蓝桥杯中的题目,通常涉及二维网格上的路径规划或区域划分问题。通过定义方向数组`dx`和`dy`来表示上下左右四个方向的偏移量,可以高效地完成对整个地图的遍历[^5]。 #### 示例代码展示 以下是一个典型的BFS模板程序,适用于求解从起点`(sx, sy)`到终点`(ex, ey)`之间的最短距离: ```python from collections import deque def bfs(grid, sx, sy, ex, ey): rows, cols = len(grid), len(grid[0]) visited = [[False]*cols for _ in range(rows)] # 记录访问过的格子 queue = deque([(sx, sy, 0)]) # 初始队列包含起点坐标及当前步数 dx = [-1, 1, 0, 0] # 定义水平移动向量 dy = [0, 0, -1, 1] # 定义垂直移动向量 while queue: x, y, steps = queue.popleft() if (x, y) == (ex, ey): # 如果到达目标位置,则返回步数 return steps for i in range(4): # 遍历四个方向 nx, ny = x + dx[i], y + dy[i] if 0 <= nx < rows and 0 <= ny < cols: # 边界条件判断 if not visited[nx][ny] and grid[nx][ny] != '#': # 若未被访问且不是障碍物 visited[nx][ny] = True # 设置已访问标志 queue.append((nx, ny, steps + 1)) # 将新坐标加入队列并增加一步计数 return -1 # 如无法抵达目的地则返回-1 # 测试数据输入部分可以根据具体题目调整 grid = [ ['.', '.', '.', '.'], ['#', '#', '.', '.'], ['.', '.', '.', '.'] ] print(bfs(grid, 0, 0, 2, 3)) ``` 上述代码实现了基本框架结构,其中包含了以下几个要点: - 使用双端队列`deque()`存储待处理节点; - 初始化布尔型矩阵`visited[]`标记哪些单元已被探索过; - 方向矢量`dx`, `dy`简化了循环逻辑设计过程; 以上均有助于提高编码效率与可读性[^4]。 #### 应用实例分析 针对实际比赛可能出现的不同类型试题,这里列举几个经典案例加以说明: ##### 案例一:岛屿数量统计 给定一张由'1'(陆地)'0'(水域)构成的地图,要求找出有多少片独立的岛群存在。此问题可以通过多次调用BFS函数分别扫描每一块尚未触及的新陆得以解答。 ##### 案例二:迷宫寻径 假设玩家位于某个封闭空间内部试图寻找出口所在方位,此时借助宽度优先策略能够快速定位最优解决方案之一。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值