我需要编写一个方法来检查完成网格(2D数组)的可能方式。
网格内部的移动是这样的:
从[0] [0]开始取内部的数字(例如14)然后转到任一个
[array.[0][0]%10][array.[0][0]/10]
或[array.[0][0]/10][array.[0][0]%10]
我们的例子:
[1][4]
或[4][1]
直到你到达数组的末尾(右下角)。
我可以到达数组的末尾(所有可能的方式) - 我的问题是计算我实际完成数组的次数 - 我不能在方法之外使用变量,并且该方法必须是递归的
这是代码:
private static int howMany(int[][] array, int y, int x, int count) {
if(y+(array[y][x]%10) < array.length && x+(array[y][x]/10)< array[y].length && array[y][x]!=0) {
System.out.println("["+y+"]["+x+"] is: "+array[y][x]);
howMany(array, y+(array[y][x]%10), x+(array[y][x]/10),count);
}
if(y+(array[y][x]/10) < array.length && x+(array[y][x]%10)< array[y].length && array[y][x]!=0) {
System.out.println("["+y+"]["+x+"] is: "+array[y][x]);
howMany(array, y+(array[y][x]/10), x+(array[y][x]%10),count);
}
if(y==array.length-1 && x==array[y].length-1) count++;
return count;
}
这显然是错误的并且将首先返回计数,我尝试了许多其他方式但无济于事...... 这是完整的类(带有要测试的数组):
编辑:非常感谢大家的帮助!
答案 0 :(得分:1)
每次调用count
时都会返回howMany
。我想你只需要保存它:
count = howMany(array, y + (array[y][x] % 10), x + (array[y][x] / 10), count);
在if
块中执行此操作。我在链接代码中进行了此更改并获得了预期结果(3
)。
答案 1 :(得分:0)
如果您已到达阵列末尾(右下角),则返回1,否则返回1+howMany(array, newY, newX)
。您不需要保留计数并且每次都传递它。该功能将起作用:
1 + returned value of 2nd call
=
1 + 1 + returned value of 3rd call
=
1 + 1 + 1 + returned value of 4th call
= ...依此类推。
最后,您将得到您想要的呼叫数量。
答案 2 :(得分:0)
您已经在正确的轨道上,因为您的方法签名返回一个int。您应该定义一个变量来保存计数,为主递归调用增加它,并且添加它是递归方法本身的结果。将计数传递到每个递归调用是不必要的,应该删除。