我正在尝试解决Project Euler问题18.我为每一行创建了一个数组(从底部开始),然后是这些数组的数组。我创建了一个从底行开始的递归方法,并向前看三行以找到最佳路径。
我创建了最小和最大方法,以确保我的数组的索引不能低于零,或高于长度减去1。
/**
* A method that sets a minimum limit for an integer
* @param a The number
* @param b The lowest value it can go
* @return a
*/
public static int min(int a, int b) {
if (a<b) {
a=b;
}
return a;
}
/**
* Sets the maximum limit for an int
* @param a the number
* @param b The highest a number can go
* @return a
*/
public static int max(int a, int b) {
if(a>b) {
a=b;
}
return a;
}
然后我在计算接下来三行中的所有可能路径时使用了这些方法。我在这行代码中得到了Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
错误:
eighthPoss = array[x+2][max(i, array[x].length-1)] + array[x+1][max(i, array[x].length-1)] + array[x][max(i, array[x].length-1)];
其中x
是当前行,i
是行中的当前位置。我有if
语句,当x+2
和x+1
超过行数时(当我们在倒数第二个或三角形的最后一行时)。我真的很困惑,这行代码中的任何内容是否超出范围,因为我在每个代码上都有最小值和最大值,以确保它们不会超出范围。我运行了print语句和循环在错误之前运行的最后数字是x=1
,i=10
。下面是我的阵列。 (我没有包括顶行,因为它只有一个数字。)
int[] row1 = {04, 62, 98, 27, 23, 9, 70, 98, 73, 93, 38, 53, 60, 04, 23};
int[] row2 = {63, 66, 04, 68, 89, 53, 67, 30, 73, 16, 69, 87, 40, 31};
int[] row3 = {91, 71, 52, 38, 17, 14, 91, 43, 58, 50, 27, 29, 48};
int[] row4 = {70, 11, 33 ,28, 77, 73, 17, 78, 39, 68, 17, 57};
int[] row5 = {53, 71, 44, 65, 25, 43, 91, 52, 97, 51, 14};
int[] row6 = {41, 48, 72, 33, 47, 32, 37, 16, 94, 29};
int[] row7 = {41, 41, 26, 56, 83, 40, 80, 70, 33};
int[] row8 = {99, 65, 4, 28, 6, 16, 70, 92};
int[] row9 = {88, 2, 77, 73, 7, 63, 67};
int[] row10 = {19, 1, 23, 75, 3, 34};
int[] row11 = {20, 4, 82, 47, 65};
int[] row12 = {18, 35, 87, 10};
int[] row13 = {17, 47, 82};
int[] row14 = {95, 64};
int[][] rows = {row1, row2, row3, row4, row5, row6, row7, row8, row9, row10, row11, row12,
row13, row14};
你能给我的任何帮助都将不胜感激。
确保你的x+2
不会越界,因为看起来你只是在检查i
是否超出范围。 (您可能正在其他地方检查它,但您没有提供该代码)。
我个人使用的奖金钳制方法,而不是单独的max和min方法(因为它们是内置于Java中)。
public static int clamp(int a, int min, int max) {
return Math.max(min, Math.min(max, a));
}