DFS生成迷宫易卡死或不连通,因未在进入递归前标记visited及未随机化方向;求解时路径为空多因未正确短路返回或回溯清理;坐标系混淆是路径偏移主因。
迷宫生成用
为什么容易卡死或生成不连通?
因为标准 DFS 生成迷宫时,如果没控制好回溯条件或访问标记逻辑,会反复在局部打转,甚至提前退出导致部分区域未打通。关键不是“用 DFS”,而是怎么让它**强制走完所有格子**。
实操建议:
立即学习
“
Java免费学习笔记(深入)
”;
用布尔二维数组
标记已访问格子,但**不能只靠递归返回才设为 true**——必须在进入递归前就设为
,否则相邻格子可能重复入栈
方向随机化必须做:每次从
(上右下左)中 shuffle 后遍历,否则固定顺序会生成明显条纹状迷宫
墙的表示要统一:推荐用
,
表示墙,
表示路径,入口/出口后期再覆盖,别在 DFS 过程中混入起点逻辑
求解迷宫时
返回路径却总是空?
Java 里函数参数传递是值传递,直接传
并在递归中 add,回溯时没清理,会导致路径错乱;更常见的是没正确处理「找到终点就立即返回」的短路逻辑。
实操建议:
立即学习
“
Java免费学习笔记(深入)
”;
用
返回值控制是否终止搜索,一旦子调用返回
,立刻 return true,不要继续 for 循环
路径记录用栈式操作:进递归前
,出递归前
,避免共享引用污染
边界和障碍判断必须前置:先检查
是否越界、是否为墙、是否已访问,三者任一成立就 return false
和递归实现 DFS 求解,哪个更容易出 bug?
递归写法简洁,但深度大时(比如 100×100 迷宫)直接
;手动用
虽可控,但容易漏掉「标记已访问」或重复入栈同一坐标。
Eclipse导入Android或其他的JAVA项目的正确方法 WORD版
本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
下载
实操建议:
立即学习
“
Java免费学习笔记(深入)
”;
小规模(≤50×50)用递归更直观;大规模务必改迭代,用
存坐标,另配
独立维护状态
迭代版每 pop 一个点,必须立刻标记
,**不能等到 push 邻居时才标**,否则同一格子可能被多次压入
需要路径时,迭代版别存「父指针」搞复杂结构——直接用
(实际用
或封装坐标类)更稳妥
生成与求解共用同一套坐标系统,为什么路径总偏移一格?
迷宫字符数组索引和「地图坐标」常被混淆:比如你认为 (0,0) 是左上角可通行点,但生成时把第一行全初始化为墙,或求解时没跳过外圈边框,就会导致所有计算 y/x 全错一位。
实操建议:
立即学习
“
Java免费学习笔记(深入)
”;
统一约定:迷宫数据从
开始放有效格子,上下左右留一圈
做边界,这样所有 DFS 不用反复写边界判断
生成后打印调试时,用双层 for 循环输出,**别用 Arrays.toString()**——它会把 char[] 当整数打印,看不出布局
求解入口坐标必须来自生成阶段明确记录的
,别靠扫描找
,除非你真写了这个字符
最麻烦的其实是坐标系和数组索引的隐式耦合,改一次方向顺序或初始化方式,整个路径就偏到隔壁房间去。动手前先拿纸画 5×5 的格子,标好索引和预期路径,比看十遍代码管用。
dfsvisitedtrue[0,1,2,3]char[][] maze'#''.'dfsListboolean dfs(int x, int y, List path) truepath.add(new int[]{x,y})path.remove(path.size()-1)x,yStackStackOverflowErrorStackStackboolean[][] visitedvisited[x][y] = trueMap parent Mapmaze[1][1]'#'startX/startY'S'