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();
        }
    }
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值