栈中存(x, y, next_dir)结构体,next_dir表示下次尝试方向;需用visited二维数组标记已访问节点避免循环;回溯时若next_dir达4则弹出,否则更新next_dir后重入栈;终点在新坐标生成后立即判断。

用栈实现迷宫路径搜索,核心是模拟“试探—失败—回退—再试探”的过程,本质是深度优先搜索(DFS)的非递归版本。栈保存的是当前已走过的路径节点,每次遇到岔路就压入新方向,走不通时就弹出栈顶,回到上一个决策点继续尝试其他方向。
栈中存什么?——关键变量设计
栈里不能只存坐标(x, y),否则无法判断该位置是否已尝试过所有方向。推荐每个栈元素为结构体或元组:(x, y, next_dir),其中 next_dir 表示从该位置出发接下来要尝试的方向编号(如 0=上,1=右,2=下,3=左)。这样每次出栈后,能直接从上次中断的方向继续,避免重复试探。
如何标记已访问?——避免死循环的关键
迷宫中同一格子不能重复进入,否则会陷入循环。需额外维护一个二维布尔数组 visited[x][y],在节点首次入栈时设为 true;出栈不重置,保证全局唯一性。注意:不能仅靠栈内是否存在来判断是否访问过,因为栈只记录当前路径,不覆盖全部历史。
回溯时机与操作流程
当位于某节点 (x, y),按 next_dir 尝试移动后发现越界、撞墙或已访问,则:
- 将该节点的 next_dir 加 1,再压入栈(表示下次从此处试下一个方向)
- 若 next_dir 已达 4(四个方向全试过),说明此节点无路可走,直接 pop 弹出,交由上一节点继续试探
- 成功走到终点时,栈中自底向上即为完整路径
边界与终止条件处理
起点入栈前必须标记 visited[start_x][start_y] = true;每次生成新坐标后,立即检查是否在迷宫范围内、是否为通路、是否未访问;终点判断放在新坐标生成后、入栈前——一旦 new_x == end_x 且 new_y == end_y,搜索成功,可终止循环并输出路径。
不复杂但容易忽略:栈中每个元素代表一个“待展开的决策状态”,不是单纯的位置快照。回溯不是倒退一步,而是放弃当前分支,回到父状态重新选路。

















