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();
}
}
}
测试结果图如下:
根据图中显示的幻方(以3阶幻方为例,讲解口诀)。第一个数字放在正中间,然后右斜上方依次填写数字,数字3的右斜上方已经有1存在了,故而将4放在3的下方,再依次进行右斜上方填写数字。
上一篇: python计算文件md5值