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]+" ");
}
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]+" ");
}
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,才对。