在递归矩阵中查找路径

时间:2019-01-11 14:35:56

标签: java matrix

我正尝试在我正在学习的课程中解决问题,在包含数字的矩阵中找到最长的路径-数字之间存在特定的差异。

我有一些私人方法来检查我可以朝哪个方向前进,但是现在我正在尝试查找坡度的“深度”。

我为每次潜水保留一个maxDepth变量-如果它是最深的,则将其分配给“深度”-由于某种原因,深度始终保持为0。

private static int longestSlope(int[][] mat, int num, int i, int j, int depth, int maxDepth ){
        if (canUp(mat, num, i, j)) {
            maxDepth = longestSlope(mat, num, i - 1, j, depth, maxDepth + 1);
            if (depth < maxDepth) {
                depth = maxDepth;
            }
            maxDepth = 0;
        }
        if (canDown(mat, num, i, j)) {
            maxDepth = longestSlope(mat, num, i + 1, j, depth, maxDepth + 1);
            if (depth < maxDepth) depth = maxDepth;
            maxDepth = 0;
        }
        if (canRight(mat, num, i, j)) {
            maxDepth = longestSlope(mat, num, i, j + 1, depth, maxDepth + 1);
            if (depth < maxDepth) depth = maxDepth;
            maxDepth = 0;
        }
        if (canLeft(mat, num, i, j)) {
            maxDepth = longestSlope(mat, num, i, j - 1, depth, maxDepth + 1);
            if (depth < maxDepth) depth = maxDepth;
        }

        return depth;
    }


private static boolean canUp(int[][] mat, int num, int i, int j) {
    if (i == 0) {
        return false;
    } else if (mat[i - 1][j] == -1) {
        return false;
    } else if (mat[i][j] - mat[i - 1][j] != num) {
        return false;
    }
    return true;
}

Screenshot from IntelliJ

1 个答案:

答案 0 :(得分:2)

在检查是否可以向各个方向移动后,您将返回depth。当您到达无法向任何方向移动的点时,这将为您带来问题。由于depth是在递归调用之后更新的,因此您的方法将返回0,并且该值将在其父递归调用中分配给maxDepth。您希望有一个基本案例检查,以确认何时无法在四个方向中的任何一个上移动。这样的事情应该可以解决问题:

private static int longestSlope(int[][] mat, int num, int i, int j, int depth, int maxDepth ){
    if(canUp(mat, num, i, j) == false && canDown(mat, num, i, j) == false && canRight(mat, num, i, j) == false) && canDown(mat, num, i, j) == false) {
        // this means that you cannot move in any of the 4 directions: the base case
        return maxDepth;
    }
    if (canUp(mat, num, i, j)) {
        maxDepth = longestSlope(mat, num, i - 1, j, depth, maxDepth + 1);
        if (depth < maxDepth) {
            depth = maxDepth;
        }
        maxDepth = 0;
    }
    if (canDown(mat, num, i, j)) {
        maxDepth = longestSlope(mat, num, i + 1, j, depth, maxDepth + 1);
        if (depth < maxDepth) depth = maxDepth;
        maxDepth = 0;
    }
    if (canRight(mat, num, i, j)) {
        maxDepth = longestSlope(mat, num, i, j + 1, depth, maxDepth + 1);
        if (depth < maxDepth) depth = maxDepth;
        maxDepth = 0;
    }
    if (canLeft(mat, num, i, j)) {
        maxDepth = longestSlope(mat, num, i, j - 1, depth, maxDepth + 1);
        if (depth < maxDepth) depth = maxDepth;
    } 
    return depth;
}

为将来参考,确定递归函数中的基本情况并返回所计算的任何值始终是一个好主意。这样做将帮助您避免此类细微的错误!