欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java实现—n阶奇数幻方

程序员文章站 2024-03-19 10:03:28
...

奇数阶幻方:

      奇数阶幻方指的是有一个行数和列数都相等的数据组成一个方阵,即由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();  

        }  

    }  

}  

测试结果图如下:

java实现—n阶奇数幻方

java实现—n阶奇数幻方

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