java递归地在数组中查找特定路径

时间:2018-06-19 15:18:42

标签: java arrays recursion

我想知道我可以在给定数组中计算2条特定路径。

  1. 我如何返回从[0] [0]到[m] [n]的最短(或最长)路径?我设法递归地遍历数组,但是我不知道如何“保存”路径并检查返回的路径是否较小。

    1. 这有点更具体和复杂-每个单元格都有一个整数(pos / neg),并且数组中的有效级数为n + 1或m + 1。我想将每个单元格的值相加并返回尽可能低的数字,以保证从[0] [0]到[n] [m]的所有单元格为正数。例如,如果路径x的最小总和为-3,则返回的数字将为4(4-3 = 1)。

第二个请求是一个困扰了我很长时间的问题,但是我看到了其他有关使用和计算带有这些数组值的东西的问题。

1 个答案:

答案 0 :(得分:0)

由于您没有很好的描述性,我将尽我所能解释基本概念。

1)检查当前坐标是否达到目标,返回当前总和。这是基本情况。

2)检查当前采取的步骤是否超过了防止无限重复所需的最大步骤数。这是失败情况,在使用广度优先搜索时必不可少。

3)检查您要走到的下一个期望位置是否在网格内,并且之前没有被访问过。将其标记为已访问,然后保存该路径中的总和。当您返回时,将该位置标记为未访问,然后尝试进行下一步操作……以此类推,以获取所有可能的方向。

4)在尝试了所有可能的路径后,比较它们的结果以找出最小的路径,并将其返回作为解决方案。

使用深度优先递归的示例:

   public void solve(int[][] a, boolean[][] visited, int sum, int steps, int x, int y, int xMax, int yMax) {
            if (isSolved(x, y)) { // Base case - solved
                return sum;
            }
            if (steps > MAX_STEPS) {
                return Integer.MAX_VALUE; // Return invalid if the algorithm exceeds maximum steps to prevent unlimited seek time
            }

            int[] path = new int[NUM_PATHS]; // An array holding the calculated paths for all possible options. Should
            for (int i = 0; i < NUM_PATHS; i++) {
                path[i] = Integer.MAX_VALUE; // Should be set to fail case as default.
            }

            if (canReach(x + 1, y) && !visited[y][x +1]) {
                visited[y][x + 1] = true;
                path[0] = solve(a, visited, sum + a[y][x + 1] steps + 1, x + 1, y, xMax, yMax);
                visited[y][x + 1] false;
            } 
            if (canReach(x - 1, y) && !visited[y][x - 1]) {
               ...
            }
            ... etc
            // Finding the best solution
            min = path[0];
            for (int i = 1; i < path.length; i++) {
                if (path[i] < min) 
                    min = path[i]; 
            }
            return min;
       }

使用动态编程,您可以优化算法,以忽略比先前发现的最佳路径差的路径,从而缩短了所需的递归。

此外,如果要保存采用的路径,请通过ArrayList进行操作,并像将节点标记为已访问时一样添加/删除它。