You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

1D递归迷宫代码运行数组越界报错,如何实现合法移动与跳出判定逻辑?

问题根因

你的代码崩溃核心是数组访问前未做边界合法性校验,同时存在多处逻辑错误:

  • 所有计算得到新索引(idx+1、idx-1、idx+jump)后,直接访问maze[新索引],如果新索引超出0~数组长度-1的合法范围,会直接触发数组越界异常
  • 逃出边界的判断逻辑完全错误:你用maze[idx] > arraySize判断逃出状态,但迷宫数组元素只有0和1,永远不可能满足该条件,永远无法返回逃出成功的结果
  • 边界判断和数组访问顺序写反:if ((maze[idx + jump]) != 1 && maze[idx + jump] < arraySize) 先访问数组再判断边界,逻辑完全颠倒
  • 没有标记已访问的位置,会出现「前进一步→后退一步」的无限递归,最终导致栈溢出

修复方案

核心逻辑调整

  1. 方法进入首先判断当前索引:如果idx >= 数组长度,说明已经逃出迷宫,直接返回true
  2. 再判断当前索引是否非法(idx < 0)或者当前位置是障碍(maze[idx] == 1),直接返回false
  3. 标记当前位置已访问(避免走回头路死循环)
  4. 按优先级尝试三种操作,只要有一条路径能逃出就返回true
  5. 所有路径都走不通返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 09:24:01