这是一个家庭作业的问题,我被困住了,如果有人能指导我,我会很高兴。
通过第一个单元格(第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);
}
感谢您的帮助!
答案 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也会返回失败状态。例如,如果列或行大于长度,则返回0.(或者您可以使用true / false)
您正在添加两个递归函数。而不是这样做尝试一个接一个。例如,首先检查使用(行+ 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)
你几乎就在那里,有几件事:
答案 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;
}