public static int getCoins(int [] [] map,int row,int col)方法

时间:2013-09-09 04:26:10

标签: java arrays methods 2d

嘿家伙所以我试图解决这个问题我正在制作一个java方法,它接受一个2D数组和2个int来指示数组中硬币采集器的起始位置。当决定向下移动哪个相邻位置(向上,向下,向左,向右)时,收集者是贪婪和懒惰的。它很贪婪,因为它移动到了该位置 硬币数量最多;它是懒惰的,因为如果没有邻近的位置增加它的硬币宝藏,它将停止移动。如果几个相邻的位置具有相同的最高硬币数量,那么 收集者将选择以顺时针方式(向上,向右,向下,向左)移动到最高点。对角线位置不被认为是相邻的。收集器从它访问的任何位置清空硬币。最后, 该方法将获得的硬币返回到收集器不再移动时的点。这是我到目前为止,但我遇到的问题是运行junit测试时,它得到一个越界错误与我检查周围值的值的方式。任何帮助解决这个问题将不胜感激。

    public class Program3 {
    public static void main(String[] args)
    {

    }
    public static int getCoins(int[][] map, int row, int col)
    {
    int cointotal = map[row][col];
    int[] numbers = new int[4];
    int big = 0;
    int a = map[row-1][col];
    int b = map[row-1][col-1];
    int c = map[row][col-1];
    int d = map[row+1][col];
    while(a > cointotal || b > cointotal || c > cointotal || d > cointotal)
    {
    numbers[0] = a;
    numbers[1] = b;
    numbers[2] = c;
    numbers[3] = d;
    big = findLargest(numbers);
    cointotal = cointotal + big;

    a = map[row-1][col];
    b = map[row-1][col-1];
    c = map[row][col-1];
    d = map[row+1][col];

   if(numbers[0] == big)
   {
       row = row -1;
       col = col;
   }
   if(numbers[1] == big)
   {
       row = row - 1;
       col = col - 1;         
   }
   if(numbers[2] == big)
   {
       row = row;
       col = col - 1;     
   }
   if(numbers[3] == big)
   {
       row = row + 1;
       col = col; 
   }
}

    return cointotal;
    }
    public static int findLargest(int[] numbers){  
    int largest = numbers[0];  
     for(int i = 1; i < numbers.length; i++){  
        if(numbers[i] > largest){  
            largest = numbers[i];  
            }    
    }  
    return largest;
    }
    }

1 个答案:

答案 0 :(得分:1)

您的数字数组的大小为3,因此从0到2。

int[] numbers = new int[3];

但是你正在访问第4个元素

    numbers[0] = a;
    numbers[1] = b;
    numbers[2] = c;
    numbers[3] = d; //OutOfBound

尝试

 int[] numbers = new int[4];

修改

我建议,在访问数组之前验证索引。

int rowLength = map.length;
int columnLength = (rowLength==0)0:map[0].length;

//other code
boolean verify(int x, int y){
   return x < rowLength && y < columnLength;
}

//then you can do something like this
int a = verify(row-1,col)? map[row-1][col]: a; //don't change if the index is outOfBounds