【蓝桥杯】搜索算法:DFS/BFS
对比维度 | BFS(广度优先搜索) | DFS(深度优先搜索) |
---|---|---|
核心遍历方式 | 按层次遍历(离起点近的节点先访问) | 深度优先(一条路径走到底再回溯) |
数据结构 | 队列(FIFO) | 栈/递归(LIFO) |
空间复杂度 | O(b^d)(b为分支因子,d为最短路径深度) | O(bm)(m为最大深度,可能远大于d) |
时间复杂度 | O(V+E)(所有节点和边访问一次) | O(V+E)(但实际可能因剪枝而更优) |
最短路径保证 | ✅ 首次到达即最短(无权图) | ❌ 需遍历所有路径比较 |
内存消耗 | 较高(存储整层节点) | 较低(仅存储当前路径) |
实现复杂度 | 需手动维护队列 | 递归实现简洁,但可能栈溢出 |
场景分类 | BFS更适合的情况 | DFS更适合的情况 |
---|---|---|
路径问题 | 无权图最短路径(迷宫、社交网络关系度) | 所有路径输出(排列组合)、存在性判断 |
连通性 | 判断两点是否连通 | 强连通分量、拓扑排序、桥/割点检测 |
图类型 | 稠密图或最短路径深度小 | 树形结构、稀疏图或路径深度大 |
空间限制 | 节点层级少(广度小) | 深度大但分支少(如线性结构) |
典型应用 | - 迷宫最短路径 - 社交网络好友推荐层级 - 网页爬虫按层级抓取 |
- 数独求解 - 排列组合问题 - 回溯算法(如八皇后) - 文件系统遍历 |
问题类型 | 推荐算法 | 原因说明 |
---|---|---|
迷宫最短路径 | BFS | 天然保证首次到达的路径最短 |
判断岛屿数量 | DFS/BFS | 连通区域检测,DFS递归写法更简洁 |
二叉树层次遍历 | BFS | 需按层输出结果 |
二叉树的最大深度 | DFS | 递归计算深度更直观 |
拓扑排序 | DFS | 后序遍历逆序即拓扑序 |
寻找图中所有路径 | DFS | 需回溯记录完整路径 |
双向广度优先搜索(Meet in Middle) | BFS | 优化搜索空间(如单词接龙问题) |
用BFS当 | 用DFS当 | 可结合使用 |
---|---|---|
需要最短路径(无权图) 问题与"层级"或"扩散"相关(如病毒传播模型) 目标节点预计离起点较近 |
需要遍历所有可能性(如排列组合) 问题具有递归性质(如树形问题) 内存有限且搜索深度可控 需要利用回溯特性(如棋盘类问题) |
迭代加深搜索(IDS):DFS模拟BFS 双向BFS:起点和终点同时BFS 记忆化DFS:避免重复计算(如动态规划) |
1. 迷宫问题(BFS)
1.1. 题目
给定一个N×M的二维矩阵表示一个迷宫,其中:
-
'S'表示起点
-
'E'表示终点
-
'.'表示可以通行的空地
-
'#'表示障碍物,不能通行
你需要编写程序,找出从起点到终点的最短路径,并输出最短路径的长度。如果无法到达终点,则输出-1。
输入格式
第一行包含两个整数N和M,表示迷宫的行数和列数。
接下来N行,每行包含M个字符,表示迷宫的具体布局。
输出格式
一个整数,表示从起点到终点的最短路径长度。如果无法到达,输出-1。
样例输入
5 5
S....
###.#
.....
.#.##
....E
样例输出