Волшебный квадрат дает ArrayIndexOutOfBoundException - PullRequest
0 голосов
/ 29 января 2019

Я работал над формированием Магического Квадрата, после прочтения алгоритма я обнаружил, что при формировании MagicSquare необходимо соблюдать определенный набор правил.

Алгоритм, которому я следую, таков:

  1. Магическая константа всегда будет равна n (n ^ 2 + 1) / 2, где n - заданная размерность.
  2. Числа, из которых состоит magicSquare, всегда будут равны от 1 до n * n.
  3. Для первого элемента, который равен 1, всегда будет в позиции (n / 2, n-1).
  4. Другие элементы будут размещены как (i -, j ++)
  5. Для размещения элементов необходимо выполнить следующие условия:

    a) If i < 0, then i = n-1.
    b) If j == n, then j = 0.
    c) This is a special case, if i < 0 and j=n happens at the same time, then i = 0, j = n-2.
    d) If the position is already occupied by some other element, then i++, j = j-2.
    
  6. Затем введите элемент в magicSquare на основеусловия.

На основании вышеприведенного алгоритма я записал код, и по какой-то причине я получаю

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3                                                                  
        at Main.generateMagicSquare(Main.java:25)                                                                                       
        at Main.main(Main.java:58) 

Этостранно.Я проверил, и чувствую, что это безопасно использовать код для получения желаемого результата, но я не знаю, где я иду не так.

Код

static void generateMagicSquare(int n){
    int[][] magicSquare = new int[n][n];

    //initialising for pos of the elem 1
    int i = n/2, j = n-1;
    magicSquare[i][j] = 1;

    //the element consist by the magic square will always be equal to 1 to n*n
    for(int num=2; num <= n*n; num++){
        //it must go like this, for any other element
        i--; j++;

        // if the element is already present
        if(magicSquare[i][j] != 0){
            i++;
            j -= 2; 
        }else{
            if(i < 0)
                i = n-1;

            if(j == n)
                j = 0;

            if(i < 0 && j == n){
                i = 0;
                j = n-2;
            }
        }

        magicSquare[i][j] = num;
    }

    for(int k=0; k<n; k++){
        for(int l=0; l<n; l++){
            System.out.print(magicSquare[k][l] + " ");
        }

        System.out.println();
    }
}

Любая помощь будет оценена.Благодарю.Поскольку я мог бы скопировать и вставить код из Интернета, но я хочу изучить его по-своему, и ваша помощь поможет мне достичь того, чего я хочу.:)

РЕДАКТИРОВАТЬ

После прочтения исключения я внес в свой код некоторые поправки, но некоторые результаты не достигли цели.

Вот мой обновленный код =======>

static void generateMagicSquare(int n){
int[][] magicSquare = new int[n][n];

//initialising for pos of the elem 1
int i = n/2, j = n-1;
magicSquare[i][j] = 1;

//the element consist by the magic square will always be equal to 1 to n*n
for(int num=2; num <= n*n; num++){
    //it must go like this, for any other element
    i--; j++;

    if(i < 0){
       i = n-1;
    }

    if(j == n){
       j = 0;
    }

    if(i < 0 && j == n){
       i = 0;
       j = n-2;
    }

    if(magicSquare[i][j] != 0){
       i++;
       j -= 2;
    }else{
       magicSquare[i][j] = num;
    }
}

for(int k=0; k<n; k++){
    for(int l=0; l<n; l++){
        System.out.print(magicSquare[k][l] + " ");
    }

    System.out.println();
}
}

Я получаю этот вывод:

2 0 6                                                                                                                                   
9 5 1                                                                                                                                   
7 3 0 

Все еще не правильный ответ для подражания.

Ответы [ 2 ]

0 голосов
/ 29 января 2019

Индекс массива - это целочисленное значение, значение которого находится в интервале [0, n-1], где n - размер массива.Если сделан запрос на отрицательный или индекс, который больше или равен размеру массива, то JAVA выдает исключение ArrayIndexOutOfBounds.Вы должны проверить значения i и j, прежде чем использовать их в массиве.Вы можете использовать следующий код:

for(int num=2; num <= n*n; num++){
        i--; j++;
        //Here We have to check the value of i and j i.e. it should less than or equal to the length of array.
        if((i <= magicSquare[0].length-1 && j <= magicSquare[0].length-1))
        {
            if(magicSquare[i][j] != 0){
                i++;
                j -= 2; 
            }else{
                if(i < 0)
                    i = n-1;
                if(j == n)
                    j = 0;
                if(i < 0 && j == n){
                    i = 0;
                    j = n-2;
                }
            }
            magicSquare[i][j] = num;
        }
    }

Для понимания ArrayIndexOutOfBoundsException, пожалуйста, посетите:

https://www.geeksforgeeks.org/understanding-array-indexoutofbounds-exception-in-java/

0 голосов
/ 29 января 2019

Эта строка выдает ошибку:

if(magicSquare[i][j] != 0)

, и проблема в том, что массив magicSquare инициализируется как:

int[][] magicSquare = new int[n][n];

, что означает, что он имеет n столбцы с индексами от 0 до n - 1 (индексы начинаются с нуля).Переменная j инициализируется как

j = n-1;

, а затем эта строка:

j++;

делает j равным nпоэтому при доступе к magicSquare[i][j] вы пытаетесь получить доступ к magicSquare[i][n]который не существует.

...