用数组实现DFS回溯路径的核心是用vector<pair<int,int>>存坐标路径并手动管理visited数组:进入时标记、退出时撤销,按值传递path可免pop,终止与剪枝均置于递归入口处。

用数组实现深度优先搜索(DFS)并回溯路径,核心在于用一维数组管理当前探索路径,配合布尔型 visited 数组标记访问状态,所有操作围绕“进入→递归→退出”三步闭环展开。关键不是堆砌结构,而是让数组承载可撤销的决策痕迹。
用 vector> 存坐标路径最直观
迷宫或网格类问题中,直接用 vector<pair<int, int>> 记录每一步的 (x, y) 坐标,调试时打印出来就是清晰的行走序列,比如 (0,0) → (0,1) → (1,1) → (2,1),一眼能看出是否绕圈、跳格或误入障碍。比起存转向码(如 0=右、1=下),它省去查表还原的麻烦,也避免因编码错误导致路径错位。初学或逻辑验证阶段,这是不可替代的选择。
visited 数组必须手动回溯,且只标记可通行格
visited 是共享状态,不能靠函数参数自动隔离,必须显式控制:
- 在确认位置合法(未越界、非障碍、未访问)后,立即设
visited[x][y] = true - 递归调用返回后,立刻设
visited[x][y] = false - 障碍格(
maze[x][y] == 0)永远不进 visited,也不参与标记——它本就不能走,标记它反而干扰逻辑
路径数组传参方式决定是否需手动 pop
两种安全做法:
-
按值传递 path:每次递归都拷贝一份新路径,进入时
path.push_back({x,y}),无需pop_back();但 visited 仍需手动回溯 -
按引用传递 + 手动 pop:函数参数为
vector<pair<int,int>>& path,则必须在递归调用后紧跟path.pop_back(),否则上层看到的是被污染的路径
全局 path 变量容易出错,不推荐;二维 vector 存所有解(如 vector<vector<pair<int,int>>>)易爆内存,仅在明确需要全部路径时才用。
终止与剪枝要落在递归入口处
到达终点时直接保存当前 path 并 return,不必等整棵树遍历完;若当前累计值已超目标(如烤鸡问题中美味值 > n)、或已选元素数超标(如配料数 > 10),就立即 return,避免无效递归。这些判断放在函数开头,逻辑干净,剪枝高效。

















