public static boolean generateMagicSquare(int n) {
int magic[][] = new int[n][n];
int row = 0, col = n / 2, i, j, square = n * n;
for (i = 1; i <= square; i++) {
magic[row][col] = i;
if (i % n == 0)
row++;
else {
if (row == 0)
row = n - 1;
else
row--;
if (col == (n - 1))
col = 0;
else
col++;
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
System.out.print(magic[i][j] + "\t");
System.out.println();
}
return true;
}
首先,我们先了解这段报错是什么意思。
java.lang.ArrayIndexOutOfBoundsException
是一个运行时异常,表示尝试访问数组的索引超出了数组界限(即索引小于0或者大于等于数组的大小)。
下面是这段代码能实现生成幻方的流程图
参数n作为幻方的行列数,初始位置为(0, n / 2), 初始位置赋值1,之后依次把数字2 ~ n * n赋值给一个位置,下一个位置为当前位置的右上。根据所在位置的坐标和n的值计算出下一个位置。边界情况:当前行是第一行,则下一行取最后一行;当前列是最右边列,则下一列取最左边列。当i能被n整除时,则将当前位置正下方的第一个位置赋值为i + 1,然后继续循环赋值。
这样得出的矩阵,满足幻方的要求。
由于在奇数的宽度的矩阵,正中间的位置,能将左右对称的划分开来,这样我们使用这个生成幻方的方法时,才能够对称的将数字都填进去。而当宽度是偶数时,(0,n/2)这个位置不处于正中,就会导致填数时位置偏移,将数填到索引界限之外。
debug实例测试结果
以偶数6为例子,会出现在i == 18的时候出现报错。因为此时18位于最左列和最下行,由于条件以偶数6为例子,会出现在i == 18的时候出现报错。因为此时18位于最左列和最下行,由于条件
在前,决定了会将row++,此时row的大小变成了6,而数组到达了边界,并没有开辟空间magic[6][0],就导致了出现“组的索引超出了数组界限”的报错。因为偶数宽度,会导致初始位置不在数组第一行的正中间,那么在判断条件的时候会比奇数更复杂。
个人理解,有误请指出,谢谢。