从顶部到网格底部的java路径

时间:2013-11-09 21:04:11

标签: java recursion path-finding

我经常看到这个问题,但它通常只涉及找到机器人可以采用的可能路径的数量。所以,问题是:有NxN网格,机器人站在网格的顶部。在一个步骤中,它只能向右或向下移动。

现在,我想打印出机器人可以采取的所有可能路径。给定NxN矩阵, 从[0] [0]开始,它必须在[N-1] [N-1]处结束。我试过的是一个简单的递归解决方案:

public static void getPaths(int[][]A, int i, int j, ArrayList<Integer> path, ArrayList<ArrayList<Integer>> allPaths) {
    int n = A.length;
    if (i>=n || j>=n) return;
    if (i==n-1 && j==n-1) {
        path.add(A[i][j]);
        allPaths.add(new ArrayList<Integer>(path));
        return;
    }
    path.add(A[i][j]);
    getPaths(A, i, j+1, path, allPaths);
    getPaths(A, i+1, j, path, allPaths);

    path.remove(path.size()-1);
}

但我不知道在哪里“重置”当前路径。

让我们说,给出了 1 2 3
4 5 6
7 8 9

矩阵,我的解决方案会给出 [1,2,3,6,9]
[1,2,3,5,6,9]
[1,2,3,5,6,8,9]
[1,2,3,5,4,5,6,9]
[1,2,3,5,4,5,6,8,9]
[1,2,3,5,4,5,6,7,8,9]

1 个答案:

答案 0 :(得分:0)

这应该可以解决问题。输出是

[[1, 2, 3, 6, 9], [1, 2, 5, 6, 9], [1, 2, 5, 8, 9], [1, 4, 5, 6, 9], [1, 4, 5, 8, 9], [1, 4, 7, 8, 9]]

public class Main {

    public static void getPaths(int[][]A, int i, int j, ArrayList<Integer> path, ArrayList<ArrayList<Integer>> allPaths) {
        int n = A.length;
        if (i>=n || j>=n) return;

        path.add(A[i][j]);

        if (i==n-1 && j==n-1) {
            allPaths.add(path);
            return;
        }
        getPaths(A, i, j+1, new ArrayList<>(path), allPaths);
        getPaths(A, i+1, j, path, allPaths);
    }

    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> allPaths = new ArrayList<>();
        getPaths(new int[][] { {1,2,3},{4,5,6},{7,8,9}}, 0,0, new ArrayList<Integer>(), allPaths );
        System.out.println(allPaths);
    }
}