n阶魔方的思想:

定义一个n*n阶数组,组委n阶魔方的数据结构,将1--n*n的数字填入其中:

1:首先填写第一行,中间列的位置为1;

2:下一个数填写在当前位置的上一行,下一列;若果存在一下情况则改正:

  1,当前行为第一行,则则下一个数由上一行改为最后一行,列仍为下一列;

  2,当前列为最后一列,则下一个数由下一列改为第一列,行仍为上一行;

  3,若果当前数的上一行,下一列的位置有数字,则改为下一行,相同列;

重复以上过程直到n*n个数字填写完毕。

规范代码:

package chuanshu;
import java.util.Scanner;
public class mofang {
public static  void nmofang(int n){
	int [][] a=new int[n][n];
	int i=0,j=n/2;
	//a[i][j]=1;
	for(int k=1;k<=n*n;k++){
		a[i][j]=k;
		if(k%n==0){
			i=(i+1)%n;
		}else{
			i=(i-1+n)%n;
			j=(j+1)%n;
		}
	}
	for(i=0;i<a.length;i++){
		for(j=0;j<a.length;j++){
			System.out.print(a[i][j]+"\t");
		}
		System.out.println();
	}
}
public static void main(String[] args){
	System.out.println("请输入要生成的魔方阶数:");
	Scanner sc=new Scanner(System.in);
	int n=sc.nextInt();
	nmofang(n);
	}
}

结果:

8 1 6 
3	5	7	
4	9	2

不明白k%n的含义;

自己理解的代码:

package chuanshu;
import java.util.Scanner;
public class nmo {
public static void mofang(int n){
	int [][] a=new int[n+1][n+1];
	int i,j;
	int k;
	i=0;j=n/2;
	while(i<n&&j<n){
	for(k=1;k<=n*n;k++){
		a[i][j]=k;
		 if(i==0&&j==n-1){ i++;j=j;
		 }
		else if(j==n-1){
			j=0;
			i=i-1;
		}
		else if(i==0){ i=n-1;
		j=j+1;
		}
		else if(a[--i][++j]!=0){
			i=i+2;
			j=j-1;
		}else{
			i--;
			j++;
		}
	}	
		}
	for(i=0;i<n;i++){
		for(j=0;j<n;j++){
			System.out.print(a[i][j]+"\t");
		}
		System.out.println();
	}
}
public static void main(String[] args){
	Scanner sc=new Scanner(System.in);
	System.out.println("请输入要计算的魔方阶数:");
	int n=sc.nextInt();
	mofang(n);
}
}

结果为:

7 1 5 
3	0	6	
4	8	2

不明白为什么4(2,0)后面直接跳到了(0,2),自己调试发现执行的i--;j++;按理说应该是:2-1=1;0+1=1,才对。