我一直在研究魔术广场的形成,在通读算法后,发现在形成魔术广场时要遵循某些规则。
我关注的算法是:
魔术常数将始终等于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();
}
}
任何帮助,将不胜感激。谢谢。既然我可以从Internet复制并粘贴代码,但是我想以自己的方式学习它,而您的帮助将帮助我实现我想要的。 :)
编辑
阅读完该异常后,我在代码中进行了一些修改,但仍有部分结果没有达到标准。
这是我更新的代码=======>
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
仍然不是正确的答案。
最佳答案
这行抛出错误:
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]
。