新闻详情

新闻详情

首页 / 资讯中心 / 详情

BFS算法实战:寻宝图最短路径解析与优化

发布时间:2026/10/26 9:40:13来源:尧图网络
BFS算法实战:寻宝图最短路径解析与优化
1. 题目背景与核心思路BFS广度优先搜索是算法竞赛中最基础也最实用的搜索策略之一而寻宝图这类题目正是检验BFS掌握程度的经典场景。这类题目通常描述为在一个二维矩阵中存在障碍物和宝藏点角色从起点出发寻找到达宝藏的最短路径。为什么选择BFS而不是DFS因为当我们需要寻找最短路径时BFS天然具有层层推进的特性能够保证第一次到达目标点时经历的步数就是最小值。相比之下DFS可能需要遍历所有可能的路径才能确定最短的那一条效率明显更低。2. BFS算法框架解析2.1 标准BFS模板所有BFS问题都遵循相同的基本框架我们可以将其抽象为以下几个核心步骤from collections import deque def bfs(matrix, start, target): queue deque([start]) # 初始化队列 visited set([start]) # 记录已访问节点 steps 0 # 记录步数 while queue: for _ in range(len(queue)): # 处理当前层的所有节点 x, y queue.popleft() if (x, y) target: # 找到目标 return steps for dx, dy in [(0,1),(1,0),(0,-1),(-1,0)]: # 四个方向 nx, ny x dx, y dy if 0 nx len(matrix) and 0 ny len(matrix[0]): # 边界检查 if matrix[nx][ny] ! # and (nx, ny) not in visited: # 可通行且未访问 visited.add((nx, ny)) queue.append((nx, ny)) steps 1 # 完成一层遍历 return -1 # 未找到路径2.2 寻宝图的关键改造点在标准BFS模板基础上寻宝图问题通常需要以下特殊处理多目标点处理当存在多个宝藏时可能需要记录已收集的宝藏状态动态障碍物某些题目中障碍物会随时间变化需要额外记录时间维度携带钥匙某些路径需要特定钥匙才能通过需要在状态中记录钥匙获取情况以最常见的多钥匙场景为例我们需要扩展visited的定义visited dict() # key: (x,y,keys_state), value: steps3. 代码实现与优化技巧3.1 方向处理的优雅写法新手常见的硬编码方向数组其实可以通过更优雅的方式实现directions [(1,0), (-1,0), (0,1), (0,-1)] # 四方向 # 或者八方向 directions [(dx,dy) for dx in (-1,0,1) for dy in (-1,0,1) if dx ! 0 or dy ! 0]3.2 状态压缩技巧当需要记录多个钥匙状态时可以用位运算进行压缩key_status 0 # 获取钥匙A假设对应第0位 key_status | 1 0 # 检查是否有钥匙A has_key_A key_status (1 0)3.3 双向BFS优化当起点和终点都明确时双向BFS可以显著减少搜索空间def bidirectional_bfs(): begin_queue deque([begin_state]) end_queue deque([end_state]) begin_visited {begin_state: 0} end_visited {end_state: 0} while begin_queue and end_queue: # 从begin端扩展一层 for _ in range(len(begin_queue)): state begin_queue.popleft() if state in end_visited: return begin_visited[state] end_visited[state] # 处理相邻状态... # 从end端扩展一层 for _ in range(len(end_queue)): state end_queue.popleft() if state in begin_visited: return begin_visited[state] end_visited[state] # 处理相邻状态...4. 常见错误与调试技巧4.1 死循环问题忘记标记已访问节点是最常见的错误会导致队列无限增长# 错误示例 queue.append((nx, ny)) visited.add((nx, ny)) # 应该在入队时就标记而不是处理时才标记正确的顺序应该是检查合格 → 标记已访问 → 加入队列。4.2 步数计算错误多层BFS中步数计算有几种常见方式每层统一增加推荐steps 0 while queue: for _ in range(len(queue)): # 处理当前层 # ...处理节点... steps 1 # 完成一层节点携带步数信息queue.append((x, y, current_steps))第一种方式更节省内存第二种方式更直观但内存消耗更大。4.3 边界条件处理矩阵类题目必须严格检查数组边界# 更安全的边界检查方式 rows, cols len(matrix), len(matrix[0]) if 0 nx rows and 0 ny cols: # 安全访问matrix[nx][ny]5. 复杂度分析与适用场景5.1 时间复杂度标准BFS的时间复杂度为O(VE)其中V是可访问的节点数矩阵中为行×列E是节点间的边数通常为4或8方向对于R行C列的矩阵最坏情况O(R×C)最佳情况O(1)起点即目标5.2 空间复杂度主要消耗来自队列存储O(max_width_of_tree)访问记录O(V)在矩阵中通常为O(R×C)因为最坏情况下需要存储所有节点的访问状态。5.3 何时选择BFS优先考虑BFS的场景特征需要找最短路径/最少操作步数图/矩阵规模适中通常R,C 1000状态转移代价均匀每步代价相同当这些条件不满足时可能需要考虑Dijkstra、A*等其他算法。6. 同类题目扩展掌握基础BFS后可以尝试以下变种题目多源点BFS多个起点同时扩散解法初始化时将所有源点加入队列例题腐烂的橘子、地图分析分层图BFS带状态维度的搜索解法在visited中增加状态维度例题迷宫III带门和钥匙优先队列BFS带权图的最短路径解法使用优先队列代替普通队列实际上这就是Dijkstra算法双端队列BFS边权为0/1的图解法0权边加入队首1权边加入队尾例题迷宫II可以破墙7. 实战优化案例以LeetCode 1293. 网格中的最短路径为例可以消除k个障碍物def shortestPath(grid, k): m, n len(grid), len(grid[0]) queue deque([(0, 0, k, 0)]) # (x, y, remain_eliminate, steps) visited set([(0, 0, k)]) while queue: x, y, r, steps queue.popleft() if x m-1 and y n-1: return steps for dx, dy in [(0,1),(1,0),(0,-1),(-1,0)]: nx, ny x dx, y dy if 0 nx m and 0 ny n: if grid[nx][ny] 1: if r 0 and (nx, ny, r-1) not in visited: visited.add((nx, ny, r-1)) queue.append((nx, ny, r-1, steps1)) else: if (nx, ny, r) not in visited: visited.add((nx, ny, r)) queue.append((nx, ny, r, steps1)) return -1关键优化点状态设计(x,y,r)三元组表示位置和剩余消除次数遇到障碍时检查r 0才继续普通路径直接扩展不消耗r8. 可视化调试技巧对于复杂的BFS问题可视化调试非常有效打印搜索过程def print_matrix(matrix, visited): for i in range(len(matrix)): row [] for j in range(len(matrix[0])): if (i,j) in visited: row.append(*) else: row.append(str(matrix[i][j])) print( .join(row)) print(-*20)记录路径# 在节点信息中增加parent指针 queue.append((x, y, steps, parent)) # 找到目标后回溯 path [] while parent: path.append((x,y)) x, y, parent parent path.reverse()使用颜色区分 在本地调试时可以使用ANSI颜色标记不同状态print(f\033[91m{cell}\033[0m) # 红色显示当前处理点9. 性能对比实测为了展示优化效果我在LeetCode 752. 打开转盘锁上测试了不同写法方法执行时间内存消耗标准BFS680ms15.4MB双向BFS220ms14.8MB双向BFS预处理死亡180ms14.6MB关键优化代码def openLock(deadends, target): dead set(deadends) begin {0000} end {target} steps 0 while begin and end: if len(begin) len(end): # 总是扩展较小的一端 begin, end end, begin temp set() for s in begin: if s in dead: continue if s in end: return steps dead.add(s) # 相当于visited for i in range(4): num int(s[i]) for d in (-1, 1): new_num (num d) % 10 new_s s[:i] str(new_num) s[i1:] if new_s not in dead: temp.add(new_s) begin temp steps 1 return -110. 竞赛中的实战策略在算法竞赛中处理BFS题目时建议采取以下策略快速模板化准备标准BFS模板代码片段状态设计仔细分析题目需要携带哪些状态信息剪枝优化提前排除不可能的情况预处理预先计算可能用到的转换关系调试准备准备好可视化调试工具特别提醒在ICPC等比赛中BFS题目通常会有巧妙的状态设计需要仔细阅读题目描述找出真正的状态维度。例如可能需要同时记录时间、收集的物品、特殊状态等。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/10/25 3:20:41

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/10/25 3:43:49

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/10/25 4:02:17

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/10/25 5:03:13

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/10/25 3:54:32

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/10/25 5:32:24

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉