DFS回溯易“走不出去”或漏解,因未区分访问标记与路径标记:仅用全局visited数组且未在回溯时撤销,或未及时弹出路径点;应进入时标记、退出时撤销,用vector配合递归栈管理路径。

为什么 DFS 回溯在迷宫中容易“走不出去”或漏解
因为没正确区分「访问标记」和「路径标记」:只用一个 visited 数组,会导致回溯时无法还原路径状态;或者在递归返回前忘了把当前点从路径容器中弹出。迷宫里每个格子可以多次经过(比如绕路),但一条合法路径里不能重复访问同一格子——这个约束必须靠「进入时标记 + 退出时撤销」来动态维护。
-
visited应该是局部作用域的路径状态,不是全局静态标记;推荐直接用std::vector<:vector>>配合递归栈生命周期管理,或更稳妥地用函数参数传递副本 - 路径记录建议用
std::vector<:pair int>>,每次递归调用前push_back,返回前pop_back;避免用全局变量,否则多路递归会互相污染 - 方向数组顺序影响搜索结果(比如优先下→右→上→左),但不影响是否找到解;若只要一个解,找到后应立即
return true并逐层跳出,别继续搜
如何写一个带路径返回的 DFS 函数(C++11 及以上)
核心是让函数返回 bool 表示是否找到路径,并通过引用参数把路径“带出来”。不要试图用返回值传整个路径(效率低且易误判空路径)。
visited
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











