递归DFS易栈溢出,应改用显式栈或加深度限制;BFS求最短路须避免存完整路径,改用prev数组回溯;注意障碍物判断、输入解析、visited初始化及容器选型。

DFS 递归实现迷宫寻路,栈溢出风险必须提前防
小迷宫(比如 20×20)用递归 dfs 写起来快,但稍大一点(50×50 以上)就容易爆栈——不是逻辑错,是系统栈被压垮了。C++ 默认线程栈通常只有 1~8MB,每层递归至少占几十字节,深搜路径一长就崩。
实操建议:
- 用
std::stack显式模拟递归栈,把row、col、path(或仅记录父节点)存进去,彻底避开函数调用栈 - 入口处加深度限制,比如
if (steps > 1000) return false;,防止死循环卡住 - 方向数组统一用
const vector,别手写四个> dirs = {{-1,0},{0,1},{1,0},{0,-1}}; if,易漏且难维护
BFS 找最短路径,队列里别存完整路径
如果目标是“最少步数”,BFS 是唯一靠谱选择;但新手常犯的错,是在 queue 里直接存 vector 表示当前路径——内存爆炸,速度断崖下跌。
正确做法是只存坐标 + 记录前驱:
- 用
queue存待扩展点> - 开一个二维数组
prev[rows][cols](类型为pair),记录每个位置是从哪来的 - 终点找到后,用
while往回溯prev拼出路径,时间空间都可控
注意:prev 初始化要填特殊值(如 {-1,-1}),否则无法判断是否访问过
障碍物和边界检查,别只靠 if(row >= 0) 这种裸判断
迷宫数组通常是 vector 或 char maze[rows][cols],但光靠下标范围检查会埋雷:
- 如果用
int maze[rows][cols],而障碍物是1、通路是0,记得检查maze[r][c] == 0,不能只看坐标合法 - 如果读入用
cin >> maze[i][j],空格/换行残留可能让某行少读一格,建议用getline+stringstream解析每行字符串 - 起点没做
visited[start_r][start_c] = true就入队?BFS 会立刻重复扩展自己,死循环
C++ 容器选型:vector 还是 array?多线程要不要加锁?
单线程迷宫求解,别碰 std::list 或 deque——vector 的连续内存 + reserve() 预分配足够快;若尺寸固定且编译期可知(比如 const int R = 100, C = 100;),用 array 更省空间、缓存友好。
多线程跑多个迷宫?每个线程用独立的 visited 和 prev 数组,完全不需要锁;但如果共享一个迷宫只读数据,确保它不被任何线程修改,否则 const 声明 + std::shared_ptr 管理更安全。
真正容易被忽略的是:调试时打印路径别用 cout 一行接一行——IO 太慢,换成 fprintf(stderr, ...) 或先拼成字符串再输出,否则你以为算法慢,其实是卡在打印上。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











