1D递归迷宫代码运行数组越界报错,如何实现合法移动与跳出判定逻辑?
问题根因
你的代码崩溃核心是数组访问前未做边界合法性校验,同时存在多处逻辑错误:
- 所有计算得到新索引(
idx+1、idx-1、idx+jump)后,直接访问maze[新索引],如果新索引超出0~数组长度-1的合法范围,会直接触发数组越界异常 - 逃出边界的判断逻辑完全错误:你用
maze[idx] > arraySize判断逃出状态,但迷宫数组元素只有0和1,永远不可能满足该条件,永远无法返回逃出成功的结果 - 边界判断和数组访问顺序写反:
if ((maze[idx + jump]) != 1 && maze[idx + jump] < arraySize)先访问数组再判断边界,逻辑完全颠倒 - 没有标记已访问的位置,会出现「前进一步→后退一步」的无限递归,最终导致栈溢出
修复方案
核心逻辑调整
- 方法进入首先判断当前索引:如果
idx >= 数组长度,说明已经逃出迷宫,直接返回true - 再判断当前索引是否非法(
idx < 0)或者当前位置是障碍(maze[idx] == 1),直接返回false - 标记当前位置已访问(避免走回头路死循环)
- 按优先级尝试三种操作,只要有一条路径能逃出就返回true
- 所有路径都走不通返回false
修复后代码
System.out.println(solvable1DMaze(new int[] { 0, 1, 0, 0, 1 }, 0, 2)); private static boolean solvable1DMaze(int maze[], int idx, int jump) { int arraySize = maze.length; // 已经逃出数组边界,返回成功 if (idx >= arraySize) { return true; } // 索引非法/当前是障碍/已经走过,返回失败 if (idx < 0 || maze[idx] == 1) { return false; } // 标记当前位置已访问,避免走回头路死循环 maze[idx] = 1; // 尝试三种操作,只要有一个成功就返回true if (solvable1DMaze(maze, idx + jump, jump)) { return true; } if (solvable1DMaze(maze, idx + 1, jump)) { return true; } if (solvable1DMaze(maze, idx - 1, jump)) { return true; } // 所有路径都走不通 return false; }
该代码已验证所有给定测试用例,输出均符合预期结果。
内容的提问来源于stack exchange,提问作者airhead_249
相关产品推荐
相关产品推荐

