版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

一、认识幻方

说到幻方,很多人可能还不知道什么是幻方。幻方是一种将一些连续的正整数安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。因为正方形格子可能是3*3或者n*n的,所以幻方就有了几阶幻方的说法。需要注意的是幻方最低是3阶!
三阶幻方 四阶幻方

二、n阶幻方实现

在网上参考了现有的求解幻方的算法,将幻方进行了分类:奇数阶幻方、单偶阶幻方、双偶阶幻方。接下来使用java来实现这三种幻方的求法。

奇数阶幻方

一、 奇数阶幻方我采用了最简单的罗伯法:
1、将最小的数放在第一行最中间
2、然后依次将下一个数放在上一个数的右上方
3、如果下一个数超出了上边界则放在下边界,纵坐标不变;超出了右边界则放在左边界,横坐标不变
4、如果下一个数的位置已经存放了数,则将下一个数放在上一个数的下方
二、思考如何将算法转换成代码
1、如何存放幻方(即如何将存放数字的排列)
数组作为一种常用的存储数据的引用类型,其下标还可以很好的方便我们对幻方里的值进行查询和修改,所以使用int类型的二维数组存储幻方中的数字。
int[][] arr=new int[len][len];//len是幻方的阶数
2、如何记录上一个数与当前数的坐标
arr数组的下标即可以记录数字的下标。我们将一系列连续的数存放在数组中肯定会使用到for循环,那么完全可以使用两个int值x,y来记录上个数的下标,然后根据罗伯法对x,y的值进行修改得到正确的当前数的下标
三、代码填充
1、定义二位数组,长度为幻方阶数
int[][] arr=new int[len][len];//len是幻方的阶数
2、将最小的数num存放在第一行正中间,同时记录该数的坐标
arr[0][len/2]=num;
int x=0;int y=len/2;
3、使用for循环存放数字
for(int i=num+1;i