bfs比dfs更适合迷宫最短路径,因为bfs按层扩展,首次到达终点时步数必为最少;而dfs可能先深入死胡同,需回溯才能找到更短路径。

为什么BFS比DFS更适合迷宫最短路径
因为BFS天然按层扩展,第一次到达终点时走过的步数一定是最少的;而DFS可能先钻进死胡同,回溯后才找到更短路径。用队列实现层次遍历,每个节点记录坐标和步数即可,不需要额外剪枝逻辑。
std::queue里该存什么数据结构
不能只存std::pair<int int></int>,否则无法知道当前走了几步。推荐封装成结构体或用std::tuple<int int></int>(x, y, steps)。实际编码中结构体更清晰:
struct Pos {
int x, y, steps;
};
// 入队:q.push({sx, sy, 0});
注意:C++17起支持结构化绑定,出队后可直接解包:auto [x, y, s] = q.front();
访问标记必须用二维数组而非std::set
迷宫规模稍大(比如1000×1000)时,std::set<:pair>></:pair>的count()操作是O(log n),总时间可能超时;而二维bool visited[ROWS][COLS]或std::vector<:vector>></:vector>是O(1)查表。
常见错误:
- 忘记初始化
visited为false - 把起点标记放在入队前,导致起点被跳过
- 在出队后才标记,造成同一格子被重复入队多次
正确做法:入队前就设visited[x][y] = true。
四个方向移动别硬写四次if
用方向数组更简洁、不易漏判:
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
for (int i = 0; i = 0 && nx = 0 && ny
<p>注意边界检查顺序:先确保索引不越界,再查<code>visited</code>和障碍物,避免访问非法内存。</p>
<p>实际写的时候最容易忽略的是「起点不可达」的返回处理——如果队列空了还没到终点,得明确返回-1或空路径。还有就是迷宫输入通常用0表示通路、1表示墙,但有些题目反着来,读题时务必确认符号定义。</p>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











