四阶幻方求解探讨

近日,我在网上看见一个网友问道,四阶幻方有多少个的问题。我看见网友们有多种回答,这也引发了我的好奇,于是也来探讨一番。

首先对幻方的填法,虽然网上发布的有很多种方法,但这些方法只能说能填写出来,但并不是全部。我孤漏寡闻,还未发现一个能找到全部幻方的填写方法,尽管四阶不算高,也未发现有一个能找到全部的填写方法。

因此要找到全部四阶幻方,就自然想到了穷举法了。

说起来很简单,将1—16个自然数放在4×4的16个小方格中,要每一行、列的数字之和为34,两条对角线的数字之和也为34。

怎样做才能做到不遗漏、不重复的找出全部?

如果直接对16个方格放数进行穷举,循环层次会有多少层?再考虑到必要的判断、排除等,其循环嵌套层级至少在16层以上。这在目前的计算语言中有几个能达到?就算达到了,因循环层级这样高,其运算效率如何?再加之16层以上的循环,循环量也会是惊人的,又要运算多久?这就决定了这条路不能走。

因此考虑首先将循环层级降下来。

我的思路为:首先,将1—16个自然数中取4个数为一组,使4个数相加等于36,再以这样的组为单位来构建幻方。那么这样的数组有多少个?经计算有2064个。为了便于叙述方便,将这2064个数组称为基数组。

1、简单直接法:假定所填写幻方形式如下:A23代表第2行第3列的数字,其余相同。从基数组中取一组数,依次定为A11、A21、A31、A41。即A11+A21+A31+A41=34,定为第一列;再从基数组中取三组B1、B2、B3、B4;C1、C2、C3、C4;D1、D2、D3、D4;E1、E2、E3、E4。但B1=A11,C1=A21,D1=A31,E1=A41且各数字也不能相同,依次确定为二、三、四行,这样这个数字方阵中每行的数字相加等于34,第一列也等于34,但第2、3、4列,两对角线的数字相加是否等于34?就要去计算、判断了。这样就将循环嵌套的层级数降到了计算机能承受的范围。但逐一地抽取、逐一地排除。尽管是用计算机,时间也要几十个小时。编程简单、时间太长,不可取。

2、转角法:在基数组的基础上再构造一种数字排列组:b1、b2、b3、b4、b5、b6、b7。7个数字,但要求b1+b2+b3+b4=34;b1+b5+b6+b7=34,当然数字各不相等是必须的。将这个数字组的集合称为转角组。从转角组中取一组出来

按图示排列,这样第一行、列的数字相加等于34,后面的部份与直接法相同。这样时间上要用十来个小时,但编程上比直接法要麻烦点。因转角组的数量比基础组大很多,因此在运行时会对电脑的内存占用也要大些。所以优势不明显。如果抽取两个转角组数据来用,想起来可能要快点,但实际上因内存占用大,循环量也很大,编程上也复杂。运行效果返而下降了。

3、三角法:在基数组基础上另构造一组排列数字组:b1、b2、b3、b4、b5、b6、b7、b8、b9;且满足:b1+b2+b3+b4=34;b4+b5+b6+b7=34;b7+b8+b9+b1=34。相当于构成了一个三角形。这样构成的数字组称为三角组。从三角组中取一组数出来按图示排列,再取一组不同的数组按图示排列,且b1=c1、b2=c2、b3=c3、b4=c4。这样数字方阵中就有第1行、第1列、第4列、两条对角线的数字相加都等于34了。剩下还有两个数字就简单多了。这种方法就将运算时间压到了

两小时左右了,编程要复杂点,内存上占用有点多,但循环嵌套层级上要少一些,所以用时就少点。

经分析:三角组的数量本来比转角组还要大得多,但因两组数据重叠率较高,所以第二组数中的自由变量只有C5、C6、C7、C8、C9等5

个数字了,再加上删除掉前面已经使用了的数,所以循环量就不大了,而后面的两个数直接通过计算排除进行,所以整个循环嵌套层级不多,而循环嵌套层级多了会使计算能力严重下降。

直接法本来很简单,但循环嵌套层级比后面两种方法要多些。所以对直接法分析后改进为:

4、优化直接法:1、确定第一列,与第一行,其方法与原直接法相同;2、确定副对线上的数,因副对角线上的数已出现两个(A41、A14),因此副对角线上的自由变量就只有两个了,再排除掉前面已经出现了的数字,其循环量就在个位至十位之间了;3、同样因有了副对角线的数字,后面的第二行、第三行的自由变量都只有两个了,所以循环量大幅下降,基本都在一两位数之间了。所以运算速度也提高了很多。时间在一小时内搞定。

通过实践、分析发现:循环嵌套层级数越多,运算速度就会下降得多;一个循环数组中受约束的数字越多(自由变量就越少)循环量就越少;幻方中对角线上的数与纵、横、斜都相关,因此在可能的情况下要优先确定,这样可以大幅减少后面的计算量。

经计算:

四阶幻方的总数为7040个(包含旋转、对称等各种情况)。

用时:30分钟

扩展:能用此法填写5阶幻方吗:

首先经计算5阶幻方的基数组个数为167280个(是4阶幻方的80倍以上),这就决定了后面的循环量是很大的。用转角法或三角法,首先是转角组三角组的容量个数都是要若干个数据库才能装下,其单个数据库的记录量是上亿级。单个库文件的都是近1.5~2G大小,这就决定了对内存的占用量和循环量。所以一般计算机根本承受不了。只能走优化直接法。

本人用优化直接法对5阶幻方尝试的结果是:计算了24小时,计算出来2514个5阶幻方。问题是这还是以1开头第一个基数组中的第一个数组,这个基数组中有5856个数组,并且这第一个数组也仅仅计算了约36%,那就是说以第一个数组构成的幻方就有可能达7千个以上,那以1开头的第一个基数组构成的幻方会是多少?整个5阶幻方总数又是多少?……这还真不是普通计算机能干的事啊!

如果说对5阶幻方还可以试一下,对6阶以上就真成了可望不可及了。

附:本人编程计算所使用的计算机及程序语言。

联想台式机Lenovo 510。处理器Intel(R) Core(TM) i5-9400F CPU @ 2.90GHz;内存:8G(机带);系统平台:Windos 10 专业版,64 位操作系统, 基于 x64 的处理器。

编程软件:Microsoft  Visual  FoxPro 9.0。

欢迎斧正、讨论QQ:2100231784。

  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值