本文主要是介绍n阶幻方【MagicSquare】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
简单介绍
幻方(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();}}
}
这篇关于n阶幻方【MagicSquare】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!