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

Java带障碍矩阵最长路径实现:代码始终返回-1问题排查

原因分析与修复

核心问题:Java值传递导致ans无法更新

Java中基本类型(如int)是值传递,你在longestPath里初始化的ans = -1,传递给findLongestPath时只是复制了一个局部副本。递归过程中对ans的修改只会影响当前方法栈里的副本,外层的ans始终保持初始值-1,这就是代码返回-1的根本原因。

次要问题:缺少障碍判断

findLongestPath的边界条件里没有检查当前格子是否是障碍(mat[x][y] == 0),如果递归移动到障碍格子会出现逻辑错误。

修复方案

用引用类型保存ans(比如长度为1的int数组),让递归中的修改能同步到外层;同时补充障碍判断:

public static int longestPath(int[][] mat, int n, int m, int xs, int ys, int xd, int yd) {
    if (mat[xs][ys] == 0 || mat[xd][yd] == 0) {
        return -1;
    }
    
    int[] ans = {-1}; // 数组作为引用传递,修改内部元素会同步到外层
    findLongestPath(mat, n, m, xs, ys, xd, yd, 0, ans);
    return ans[0];
}

public static void findLongestPath(int[][] mat, int n, int m, int x, int y, int xd, int yd, int pathLength, int[] ans) {
    // 先判断是否到达终点,更新最长路径
    if (x == xd && y == yd) {
        ans[0] = Math.max(pathLength, ans[0]);
        return;
    }
    
    // 越界、是障碍、已访问,直接返回
    if (x < 0 || y < 0 || x >= n || y >= m || mat[x][y] == 0 || mat[x][y] == 2) {
        return;
    }
    
    // 标记当前格子为已访问
    mat[x][y] = 2;
    
    // 递归遍历四个方向
    findLongestPath(mat, n, m, x + 1, y, xd, yd, pathLength + 1, ans);
    findLongestPath(mat, n, m, x - 1, y, xd, yd, pathLength + 1, ans);
    findLongestPath(mat, n, m, x, y + 1, xd, yd, pathLength + 1, ans);
    findLongestPath(mat, n, m, x, y - 1, xd, yd, pathLength + 1, ans);
    
    // 回溯,取消标记
    mat[x][y] = 1;
}

额外说明

  • 路径长度的计算:示例中输出24是指从起点到终点的移动步数(对应25个格子),修复后的代码逻辑符合这个计算方式。
  • 回溯逻辑:递归结束后将格子恢复为1,确保其他分支能正常访问该格子,这部分你的原代码是正确的。

内容的提问来源于stack exchange,提问作者Fatima

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 22:50:29