计算矩阵中的路径

时间:2013-05-24 16:28:23

标签: java recursion backtracking

这是一个家庭作业的问题,我被困住了,如果有人能指导我,我会很高兴。

通过第一个单元格(第0行第0列)的statring定义合法路径,并通过在单元格中添加数字的第一个和第二个数字来计数到下一步,直到到达最后一个单元格(行n collumn n)。

例如: 如果在单元格[2] [3]中有数字15,则下一步可以是: 行中+1,而列中的+5 [3] [8] 要么 行中的+5和[7] [4]

的列中的+1

该方法应返回有多少合法路径。

我正在尝试使用回溯递归方法解决此问题,我不能使用任何循环或任何其他方法,但重载方法。

这是我到目前为止提出的代码:

public static int countPaths (int[][] mat)
{
    return countPaths(mat,0,0);
}

private static int countPaths(int[][] mat, int col, int row)
{


    if ((col==mat.length-1 && row==mat[0].length-1 )  {
        return 1;
    }    
    return countPaths(mat,mat[col][row]/10+col,mat[col][row]%10+row) + countPaths(mat,mat[col][row]%10-col,mat[col][row]/10-row);

} 

感谢您的帮助!

5 个答案:

答案 0 :(得分:1)

如果我正确理解了问题,这是一个解决方案。

公共类MatrixPathCounter {     private static int [] [] mat = {{10,11,0},{10,11,10},{10,10,0}};

public static void main(String[] args)
{
    System.out.println(countPath(mat,0,0));
}

private static int countPath(int[][] mat, int x, int y)
{
    int n = mat.length -1;

    if (x==n && y==n)
        return 1;

    if(x>n || y>n)
        return 0;

    if(mat[x][y]==0)
        return 0;

    if(x+mat[x][y]/10 == x+mat[x][y]%10 && x+mat[x][y]%10 == x+mat[x][y]/10)
        return countPath(mat,x+mat[x][y]/10,y+mat[x][y]%10);
    else
        return countPath(mat,x+mat[x][y]/10,y+mat[x][y]%10) + countPath(mat,x+mat[x][y]%10,y+mat[x][y]/10 ); 
}

}

答案 1 :(得分:0)

因为它是一个家庭作业,所以只是我的一些提示

  1. 而不是仅返回1也会返回失败状态。例如,如果列或行大于长度,则返回0.(或者您可以使用true / false)

  2. 您正在添加两个递归函数。而不是这样做尝试一个接一个。例如,首先检查使用(行+ 1,com + 5),如果它重新调整失败,则尝试(行+ 5,col + 1)。

答案 2 :(得分:0)

    return countPaths(mat,mat[col][row]/10+col,mat[col][row]%10+row) + countPaths(mat,mat[col][row]%10-col,mat[col][row]/10-row);

“通过第一个单元格(第0行第0列)的statring定义合法路径,并通过在单元格中添加数字的第一个和第二个数字来计数到下一步,直到到达最后一个单元格( row n collumn n)。

例如:如果在单元格[2] [3]中有数字15,则下一步移动可以是:行中+1,行中+5到[3] [8]或行中+5列中的+1为[7] [4]“

在我看来,就像你在确定行和col在某种程度上是关闭的逻辑一样。你应该得到相同的两位数字,只需切换它们。我的建议是将数字值存储在变量中,以使代码更清晰。我知道如何解决这个问题,但是如果我为你解决这个问题你就不会学到任何东西。

我还会像其他用户指出的那样,确保通过检查它们是否仍然有效来关闭“死胡同”路径。此时,返回0。

答案 3 :(得分:0)

你几乎就在那里,有几件事:

  • 在计算可能的后续步骤
  • 时,似乎存在错误
  • 你应该在访问数组/进行递归调用之前检查边界,以避免ArrayOutOfBoundsException

答案 4 :(得分:-1)

这是我想出的:

public static void main(String[] args)
{
    int[][] mat = 
        {
                {12, 22, 23, 54},
                {43, 35, 21, 20},
                {34, 21, 43, 21},
                {25, 30, 0,  20},
                {0,  22, 10, 10},
                {20, 13, 3,  45},
        };
    
    System.out.println(countPaths(mat)); // 3
}

public static int countPaths(int[][] mat)
{
    return countPaths(mat, 0, 0);
}

private static int countPaths(int[][] mat, int row, int col)
{           
    if (row == mat.length - 1 && col == mat[row].length - 1)
        return 1;
    
    if (row >= mat.length || col >= mat[row].length)
        return 0;
    
    if (mat[row][col] <= 0 || mat[row][col] >= 100)
        return 0;
    
    int currentNumber = mat[row][col];
    int rightDigit = currentNumber % 10, leftDigit = (currentNumber / 10) % 10;
    
    int r1 = countPaths(mat, row + rightDigit, col + leftDigit);
    int r2 = countPaths(mat, row + leftDigit, col + rightDigit);
    
    return r1 + r2;
}