Я работал над формированием Магического Квадрата, после прочтения алгоритма я обнаружил, что при формировании MagicSquare необходимо соблюдать определенный набор правил.
Алгоритм, которому я следую, таков:
- Магическая константа всегда будет равна n (n ^ 2 + 1) / 2, где n - заданная размерность.
- Числа, из которых состоит magicSquare, всегда будут равны от 1 до n * n.
- Для первого элемента, который равен 1, всегда будет в позиции (n / 2, n-1).
- Другие элементы будут размещены как (i -, j ++)
Для размещения элементов необходимо выполнить следующие условия:
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.
Затем введите элемент в 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
Все еще не правильный ответ для подражания.