package practice;
public class magic_2 {
public static int[][] creat(int i, int j,int n,int number,int number1,int mat[][]) {
for (int k = 1; k <= n * n; k++) {
mat[i][j] = k;
if (k % n == 0)
//对角线已满的时候可以上下左右4种情况
switch (number) {
case 0:i = (i + 1) % n;break; //下一行
case 1:i = (i - 1 + n) % n;break; //上一行
case 2:j = (j - 1 + n) % n;break; //左一列
case 3:j = (j + 1) % n;break; //右一列
default: break;
}
else {
//下一位置有可能出现的情况
switch (number1) {
case 0: //右上方
i = (i - 1 + n) % n;
j = (j + 1) % n;
break;
case 1: //右下方
i = (i + 1) % n;
j = (j + 1) % n;
break;
case 2: //左上方
i = (i - 1 + n) % n;
j = (j - 1 + n) % n;
break;
case 3: //左下方
i =(i + 1) % n;
j = (j - 1 + n) % n;
break;
default:
break;
}
}
//如果出现错误直接返回null。
if (i<0||i>=n) {
return null;
}
}
return mat;
}
public static boolean test(int n,int mat[][]){
boolean bool =true; //新建a,b,c数组分别用来保存 mat数组的每一行,每一列和两个对角线之和
int a[]=new int[mat.length];
int b[]=new int[mat.length];
int c[]=new int[2];
for(int i=0;i<mat.length;i++){ //计算行,列,对角线的和
for(int j=0;j<mat[i].length;j++){
a[i]+=mat[i][j];
b[i]+=mat[j][i];
}
c[0]+=mat[i][i];
c[1]+=mat[i][mat.length-1-i];
}
for(int i=0;i<mat.length;i++){ //判断其和是否满足,不满足则bool=false
if(a[i]!=(1+mat.length*mat.length)/2*mat.length||
b[i]!=(1+mat.length*mat.length)/2*mat.length||
c[0]!=(1+mat.length*mat.length)/2*mat.length||
c[1]!=(1+mat.length*mat.length)/2*mat.length)
bool=false;
}
return bool;
}
public static void print(int k,int mat[][]){
System.out.println("第"+k+"种情况:");
for(int i=0;i<mat.length;i++){
for(int j=0;j<mat[i].length;j++)
System.out.print(mat[i][j]+" ");
System.out.println();
}
}
public static void main(String arg[]) {
int n=3,k=1; //代表幻方阶数,k用来计数输出的个数
int number = 0; //对角线已满的时候可以上下左右4种情况
int number1 = 0; //下一位置有可能出现的情况
int mat[][] = new int[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (number = 0; number <= 3; number++) {
for (number1 = 0; number1 <=3; number1++) {
mat = creat(i,j,n,number,number1,mat);
if (test(n,mat)){
print(k,mat);
k++;
}
}
}
}
}
}
}