简单介绍
幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。
幻方包括:奇数幻方、单偶数幻方和双偶数幻方
单偶数幻方(即4n+2式):幻方阶数n为不能被4整除的偶数,比如6、10、14
双偶数幻方(即4n式):幻方行列数n能被4整除的幻方,比如4、8、12
算法分析:
-
奇数阶幻方:下一个元素在右上角,出列就延展,若为倍数放下一行
以n = 3为例:
1.第0行最中间为1
2.下一个位置是右上方,如5、6;若越界,将沿行、列方向看成环形,如2、3
3.若当前位置是n的倍数,表示一条对角线已满,则下一个位置是本列下一行,如4、7 -
单偶数阶幻方
思考ing待更新… -
双偶数阶幻方
以 n = 8为例:
1.用横线和竖线将n阶方阵划分为m个4 * 4的小方阵
2.将n * n个数从小到大,从左到右,从上到下依次填入方阵中,遇到4 * 4小方阵的对角线不填(此位置不填的数不作为下一个位置填入的数)
3.将n * n个数从大到小,从左到右,从上到下依次填入方阵中4 * 4小方阵的对角线上,其他位置不填(此位置不填的数不作为下一个位置填入的数)
代码如下:
import java.util.Scanner;
public class MagicSquare {
public static void main(String[] args) {
System.out.println("请选择想输出幻方的阶数:");
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int array[][] = new int[n][n];
if (n%2!=0){ //奇数阶
oddMagic(n,array);
}else if (n%4!=0){ //单偶数阶
return;
}else{ //双偶数阶
doubleEvenMagic(n,array);
}
printSquare(array);
}
public static void oddMagic(int n,int array[][]){
int i = 0;
int j = n/2;
for (int k = 1; k <= n*n; k++) {
array[i][j] = k;
if (k%n==0) { //如果当前数字是n的倍数,向下走
i++;
}else{ //如果当前数字不是n的倍数,向左上走
i--;
j++;
if (i<0) i=n-1;
if (j>n-1) j=0;
}
}
}
public static void doubleEvenMagic(int n,int array[][]){
int c1=1,c2=n*n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i%4==j%4||(i+j)%4==3){ //对角线则反排
array[i][j] = c2;
}else{ //非对角线正排
array[i][j] = c1;
}
c2--;
c1++;
}
}
}
public static void singleEvenMagic(int n,int array[][]){
System.out.println("思考ing...待更新...");
}
public static void printSquare(int array[][]){
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.printf("%4d",array[i][j]);
}
System.out.println();
}
}
}