查找两个单元格之间的路径数

时间:2017-06-11 22:22:39

标签: java

这里的练习: 我需要编写递归方法,该方法获得具有n * n大小的正int数的矩阵,起始单元格行和列索引以及完成单元格行和列索引,并且该方法需要返回从起始单元格到完成单元格的可能路径数量这些限制: a。您可以从当前位置移动到左侧单元格,右侧单元格,上部单元格或下部单元格 b。你不能越过主对角线,但是你可以去对角线上的细胞(但不能越过它)。 c。路由中的每个单元只出现一次。 d。矩阵需要像最初的原始单元格一样的原始矩阵

这是我到目前为止所得到的:

public static int numPaths (int[][] mat,int x1, int y1, int x2, int y2){
        if(x1>y1 || x2>y2 || y1<x1 || y2<x2) return 0;
        return numPaths(mat ,x1, y1, x2, y2, x1, y1);
    }
    public static int numPaths (int[][] mat ,int x1, int y1, int x2, int y2, int row, int col){
        if(row<0 || col <0 || row>=mat.length || col>=mat.length ) return 0;
        if(row==x2 && col==y2){ 
            return 1;
        }
        if(row==col){ 
            return numPaths ( mat ,x1, y1, x2, y2, row, col+1) + numPaths( mat ,x1, y1, x2, y2, row-1,col);

        }
        else{
            return numPaths( mat ,x1, y1, x2, y2, row, col+1) + numPaths( mat ,x1, y1, x2, y2, row+1, col)+
                    numPaths( mat ,x1, y1, x2, y2, row-1, col) + numPaths( mat ,x1, y1, x2, y2, row, col-1);    
            }

        }

但是我得到了堆栈溢出错误,因为当我之前访问过这个单元格时,我无法改变它。我确信有一种方法可以在递归方法中更改单元格中的值,并在以后将其恢复正常但我无法想办法如何做到这一点。

请告知

1 个答案:

答案 0 :(得分:0)

如果您打算使用矩阵来存储是否已访问过某个单元格,那么最好将其作为布尔矩阵。然后,在递归之前将值设置为true然后在之后将其设置为false是一件简单的事情。

以下内容应该有效。我已经将变量移到了类中,因为它似乎没有必要传递它们。

类似于:

private final int size;
private final boolean visited[][] = new boolean[size][size];

public int numPaths(int x, int y) {
    if (visited[x][y] || x < 0 || y < 0 || x >= size || y >= size)
        return 0;
    if (x == size - 1 && y == size - 1)
        return 1;
    visited[x][y] = true;
    int numPaths = 0;
    numPaths += numPaths(x - 1, y) + numPaths(x, y - 1);
    if (x != y)
        numPaths += numPaths(x + 1, y) + numPaths(x, y + 1;
    visited[x][y] = false;
    return numPaths;
}