我一直在研究魔术广场的形成,在通读算法后,发现在形成魔术广场时要遵循某些规则。

我关注的算法是:


  
  魔术常数将始终等于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列,其索引从0n - 1(索引从零开始)。
变量j初始化为

j = n-1;


然后此行:

j++;


使j等于n
因此,当您访问magicSquare[i][j]时,您将尝试访问不存在的magicSquare[i][n]

10-06 08:55