java实现—n阶奇数幻方

来源:互联网 发布:mac用hdmi连接电视 编辑:程序博客网 时间:2024/04/30 05:33

奇数阶幻方:

      奇数阶幻方指的是有一个行数和列数都相等的数据组成一个方阵,即由1~n*n个数据组成,由于是奇数阶幻方,所以阶数n必须是奇数。

其要求为:每行、每列和对角线上的数据之和相等。

法国人罗伯总结出了构造奇数阶连续自然数幻方的简单易行的方法“罗伯法”。口诀如下:

一居上行正中央:

第一个数字放在首行最中间的格子中;

依次斜填切莫忘:

向右上角斜行按照从小到大的顺序依次填入数字;

上出框时向下放:

如果右上方向出了上边界,就以出框后的虚拟方格位置为基准,将数字竖直降落至底行对应的格子中;

右出框时左边放:

同上,向右出了边界,就以出框后的虚拟方格位置为基准,将数字平移至最左列对应的格子中;

重复便在下格填:

如果数字右上的格子已被其它数字占领,将该数字填写在下面的格子中;

右上重复一个样:

如果朝右上角出界,和上面重复的情况做同样处理,依然放在下方。

相关java代码如下:

package test1;import java.util.Scanner;//奇数阶幻方的实现public class Practice {      //n为用户输入的n阶奇数幻方   n为奇数    public static int[][] magicOdd(int n) {          //构造一个(n+2)*(n+2)矩阵        int[][] square = new int[n + 1][n + 1];          int i = 0;          int j = (n + 1) / 2;          //从第一行的中间那个数字(是1)开始填幻方        //n阶幻方一共有n*n个数字(从1~n*n)        //奇数阶幻方的实现算法        for (int key = 1; key <= n * n; key++) {              if ((key % n) == 1)                  i++;              else {      // //填充当前数的右上角那个数                i--;                  j++;              }              if (i == 0)  {      ////判断条件:若是在(n+2)*(n+2)阶方阵的第一行                i = n;             }            if (j > n) {                 j = 1;              }            square[i][j] = key;          }          //对(n+2)*(n+2)阶的方阵进行筛选出中间的n*n阶幻方        int[][] matrix = new int[n][n];          for (int k = 0; k < matrix.length; k++) {              for (int l = 0; l < matrix[0].length; l++) {                 matrix[k][l] = square[k + 1][l + 1];              }          }          return matrix;      }      public static void main(String[] args) {          Scanner a=new Scanner(System.in);        int b=a.nextInt();        //b为用户输入的奇数        System.out.println();         int[][] magic = Practice.magicOdd(b);         for (int k = 0; k < magic.length; k++) {              for (int l = 0; l < magic[0].length; l++) {                 System.out.print(magic[k][l] + "    ");              }              System.out.println();          }      }  }  

测试结果图如下:

3阶幻方

这里写图片描述

根据图中显示的幻方(以3阶幻方为例,讲解口诀)。第一个数字放在正中间,然后右斜上方依次填写数字,数字3的右斜上方已经有1存在了,故而将4放在3的下方,再依次进行右斜上方填写数字。

原创粉丝点击