我一直在研究魔术广场的形成,在通读算法之后,我发现在形成魔术广场时要遵循某些规则。
我关注的算法是:
- 魔术常数将始终等于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
仍然不是正确的答案。
答案 0 :(得分:1)
此行引发错误:
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]
不存在。
答案 1 :(得分:0)
数组的索引是一个整数值,其值在间隔[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/