当前位置: 首页 > 知识库问答 >
问题:

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

傅琦
2023-03-14

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

> < li>

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

第二个请求是一个我已经纠结了很长时间的问题,但我看到了关于使用和计算这些数组中的值的其他问题。

共有1个答案

弘浩博
2023-03-14

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

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进行保存,并像您将节点标记为已访问时一样添加/删除它。

 类似资料:
  • 我试图使用DFS解决一个图形问题,但遇到了一堵墙。这是我在Python3中的实现。unvisited是一个整数数组,start和end是unvisited中的整数,path是一个空数组,在DFS运行时填充,edges是一个边字典。 目标是找到一条从开始到结束访问unvisted中所有int的路径。因此,我遇到了递归的问题(我认为),因为在路径错误的情况下,我不想返回任何东西;相反,我希望DFS继续

  • 我正在尝试编写递归方法,如果存在从[0]到[a.length-1]的路径,当您可以对a[I]求和或求减法时,该方法将返回true。例如,在数组a={2,4,1,6,4,2,4,3,5}中,该方法返回true,因为0 2-1 4 2-3 4=8=a[a.length-1]。我尝试了一些方法,但我得到了堆栈溢出或错误的输出。

  • 我需要编写一个递归方法,它需要两个并行数组和单词来查找,查找指定的单词并在另一个数组上每次索引匹配时求和值。例如: 如果我说我需要查找单词,它应该在找到索引时对第二个数组上的值求和。在这种情况下,它应该求和,。 如何使我的递归方法使其采用适当的参数并递归地进行计算。我将使用硬编码值。 这是我目前所拥有的。我很确定我的递归方法需要更多参数,但我会看看是否有人能帮助我

  • 问题内容: 对于需要解决的问题之一,我使用for循环找到了数组的最大值,因此我尝试使用递归找到它,这就是我想出的: 因此它可以正常工作并获取最大值,但是我的问题是:对于基本情况,返回a [head]以及对于在开头处的值大于最后一个值的情况,可以吗? 问题答案: 您只需一个计数器即可轻松完成此操作,只需使用您这次想要比较的值的索引即可: 这样可以更好地显示正在发生的情况,并使用默认的“递归”布局,例

  • 在PHP中,检查数组是否为递归数组的最佳方法是什么? 给定以下代码: 从PHP手册: print\u r()在到达数组的第三个元素时将显示递归。 似乎没有其他方法可以扫描数组中的递归引用,因此如果需要检查它们,则必须使用print\u r()及其第二个参数来捕获输出并查找单词RECURSION。 还有更优雅的检查方式吗? 附:这就是我如何使用regex和print\u r()检查和获取递归数组键的