我在考试中写了一个回溯代码,在单元格和计数路径之间移动,条件是下一个单元格是 i+k 或 j+k 或 ik 或 jk。即使由于我试图阻止它这样做,代码仍然以某种方式超出范围。
我尝试通过在“if”条件的检查有效移动中添加 +1 来添加修复代码。
public class Test3
{
public static int howManyPaths(int [][] mat)
{
return howManyPaths(mat,0,0,0);
}
private static int howManyPaths(int [][] mat, int i, int j, int count)
{
if(i == mat.length-1){return count;}
if(j == mat[i].length-1){return howManyPaths(mat,i+1,0,count);}
count = pathCount(mat,i,j);
return howManyPaths(mat,i,j+1,count);
}
private static int pathCount(int [][] mat, int i, int j)
{
int k = mat[i][j];
if(i < mat.length-1 && mat[i][j] == mat[i+k][j] && i+k < mat.length-1){
return 1 + pathCount(mat,i+k,j);}
if(j < mat[i].length-1 && mat[i][j]==mat[i][j+k] && j+k < mat[i].length-1){
return 1 + pathCount(mat,i,j+k);}
if(i > 0 && mat[i][j]==mat[i-k][j] && i-k > 0){
return 1 + pathCount(mat,i-k,j);}
if(j > 0 && mat[i][j]==mat[i][j-k] && j-k > 0){
return 1 + pathCount(mat,i,j-k);}
return 1;
}
}
预期是有多少路径和实际结果“越界”。
使用 fixet 代码编辑仍然无法正常工作
在您的代码中,
if(i < mat.length-1 && mat[i][j] == mat[i+k][j]){
return 1 + pathCount(mat,i+k,j);}
如果i+k>=mat.length 会是什么?或者,
if(j < mat[i].length-1 && mat[i][j]==mat[i][j+k]+1){
return 1 + pathCount(mat,i,j+k);
如果j+k>=mat[i].length 会是什么?或者,
if(i > 0 && mat[i][j]==mat[i-k][j]){
return 1 + pathCount(mat,i-k,j);}
如果ik<0 会怎样?或者,
if(j > 0 && mat[i][j]==mat[i][j-k]){
return 1 + pathCount(mat,i,j-k);}
如果jk<0 会怎样?
处理这些情况也是如此。看,i>0,仍然ik可以小于或等于0。这就是你的情况的诀窍。
希望你现在明白了。
编辑:在您编辑代码后,仍然会遇到与您访问索引相同的异常,然后检查索引是否有效。
不是这个:
if(i < mat.length-1 && mat[i][j] == mat[i+k][j] && i+k < mat.length-1)
相反,你必须写:
if(i < mat.length-1 && i+k < mat.length-1 && mat[i][j] == mat[i+k][j])
对其他人也一样。
通过这样做,您将能够摆脱java.lang.ArrayIndexOutOfBoundsException
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句