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
相关产品推荐
相关产品推荐

