Я не совсем уверен, почему я получаю индекс массива Out Of Bounds Exception. Насколько я понимаю, мой двойной массив имеет размер 3, поэтому индекс идет от 0 до 2. В моем методе isSolvable я пытаюсь подсчитать количество инверсий в моем двойном массиве, где инверсия представляет собой любую пару блоков i и j, где i < j, но я появляется после j, рассматривая плату в строчном порядке. Я пытаюсь сделать это, преобразовывая свой 2d-массив в 1-й массив, чтобы я мог пройти через массив 1d, чтобы подсчитать все инверсии. Если инверсии четные (в пределах доски с нечетным номером), то 8 головоломок разрешимы. Мои циклы for только учитывают длину массива, поэтому я не совсем уверен, как я получаю исключение из массива Out Of Bounds.Индекс массива за пределами границ - преобразование 2d в 1d
Заранее благодарен! Каждый ответ помогает и мешает мне совершать те же ошибки в будущем.
int N = 3;
static int [][] copy;
//construct a board from an N-by-N array of blocks
//(where blocks[i][j] = block in row i, column j)
public Board(int[][] blocks){
blocks = new int[N][N]; //creates array of size N
//generates random numbers 0 inclusive to # exclusive
//creates ArrayList - shuffle used to prevent repeating of numbers
List<Integer> randomList = new ArrayList<>();
for (int i = 0; i < 9; i++){
randomList.add(i);
}
int counter = 0;
Collections.shuffle(randomList);
for (int i = 0; i < blocks.length; i++){
for (int j = 0; j < blocks[i].length; j++){
blocks[i][j] = randomList.get(counter);
counter++;
}
}
copy = blocks.clone();
}
//is the board solvable?
public boolean isSolvable(){
int inversions = 0;
List<Integer> convert = new ArrayList<>(); // used to convert 2d to 1d
for (int i = 0; i < copy.length; i++){
for (int j = 0; i < copy[i].length; j++){
convert.add(copy[i][j]); //ARRAYINDEXOUTOFBOUNDSEXCEPTION: 3
}
}
for (int i = 0; i < copy.length; i++){ //counts the number of inversions
if (convert.get(i) < convert.get(i-1)){
inversions++;
}
}
if (inversions % 2 == 0){
return true; //even
}
return false; //odd
}
//unit test
public static void main(String[] args){
//prints out board
printArray();
Board unittest = new Board(copy);
unittest.isSolvable(); //ARRAYINDEXOUTOFBOUNDSEXCEPTION: 3
}
Большое спасибо! – cannotcompute