标签:
一、提出问题
所谓“奇数阶魔方阵”是指n为不小于3的奇数的魔方阵。这类魔方阵的形式多样,这里我们仅讨论其中的一种形式的正规魔方阵。例如:3阶、5阶和7阶的魔方阵如图3 – 4 所示。
图3 – 4 3阶5阶和7阶魔方阵
容易知道,这三个魔方阵的魔方常数分别是15、65和175。
现在要求给出:能让计算机自动输出类似图3 – 4 所示的n阶奇数魔方阵的算法,其中n为任意给定的一个不小于3的奇数。
二、简单分析
决定“奇数阶魔方阵”的关键是要按要求决定其方阵中的各个数字。观察图3 – 4中的三个奇数阶魔方阵,不难发现:
1.由于是正规魔方,故所填入的n 2个不同整数依次为1、2、3、…、n 2 ;
2.各行、列和对角线上的数字虽各不相同,但其和却是相同的。这表明,其魔方常数可由公式n ( n 2 + 1 ) / 2得到。
3.数字在阵列中的次序,并没有遵从阵列单元的行、列下标的顺序,但数字“1”却始终出现在阵列第一行的正中间位置,而数字“n 2”也始终出现在阵列第n行的正中间位置,这说明阵列中的数字排列应该是有一定规律的。
import java.util.Scanner; /** * * @author 冷血 * */ public class Java_4 { private int[][] a; private int j ,i ,sum = 1; private int N,n; public Java_4(int n){ N = n; this.n = n; N=N-1; a = new int[n][n]; } public void jiSuan(){ i = 0; j=n/2; a[i][j] =sum ; while(sum<=n*n){ if(i==0&&j!=N){ i = N; j++; sum++; a[i][j]=sum; } if(sum==n*n) break; if(j==N&&i!=0){ j=0; i--; sum++; a[i][j]=sum; } if(j==N&&i==0){ i++; sum++; a[i][j]=sum; } if(sum==n*n) break; if(i!=0&&j!=N&&a[i-1][j+1]==0){ i--;j++;sum++; a[i][j] = sum; } if(sum==n*n) break; if(i!=0&&j<N&&a[i-1][j+1]!=0){ i++;sum++; a[i][j] = sum; } if(sum==n*n) break; } if(i==0&&j==0){ i=N;sum++;j++; a[i][j] = sum; } } public void paint(){ for(int k = 0;k<a.length;k++){ for(int l = 0;l<a.length;l++){ System.out.printf("%-5d",a[k][l]); } System.out.println(); System.out.println(); } } public static void main(String[] args) { int m=0; @SuppressWarnings("resource") Scanner nuber = new Scanner(System.in); m = nuber.nextInt(); Java_4 java = new Java_4(m); java.jiSuan(); java.paint(); } }
标签:
原文地址:http://www.cnblogs.com/qq1402876003/p/4998346.html