【蓝桥杯】算法笔记5
| 对比维度 | 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
