ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 高效办公必会的Office实战技巧 免费下载Excel行业应用视频
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 2187|回复: 21

生成所有符合条件的四阶幻方

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-2-7 16:32 | 显示全部楼层 |阅读模式
本帖最后由 Moneky 于 2017-2-7 23:53 编辑

用代码生成所有的四阶幻方,
注:这里的四阶幻方特指→在4×4的方格中填入1-16,使横竖斜的和都相等

本题不恶搞

点评

看了几个月这类主题了。看吐了,楼主以后最好少学某人…… 没有最后五个字,这帖直接就是评-5技术了(-50的已经给过一次了)。  发表于 2017-2-7 23:14

TA的精华主题

TA的得分主题

发表于 2017-2-7 19:56 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-2-7 20:18 | 显示全部楼层
首先分析,
横竖斜一共有4+4+2=10个4数相加计算式,
其中1-16个数被使用2-3次(对角线8个数使用3次,其余使用2次)
因此,它们的总和范围如下:
最小值=36+136*2 =308 (1-8之和=36、1-16之和=136),而每个计算式之和=308/10=30.8取整数=31
最大值=136*2+100 =372 (1-16之和=136、9-16之和=100),各计算式之和=372/10=37.2取整数=37

所以,按每一个计算式总和范围:31-37计算即可大大简化递归时的计算量。



TA的精华主题

TA的得分主题

发表于 2017-2-7 20:31 | 显示全部楼层
每产生一次结果,都可以进行含自身的8种旋转、镜像对称。

刚刚随手凑了一组:
1        15        14        4
12        6        7        9
8        10        11        5
13        3        2        16

都是=34的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-7 23:19 | 显示全部楼层
本帖最后由 Moneky 于 2017-2-7 23:20 编辑

@joforn 这玩意我还没法回复,只有这样了。我也是看那个人的帖看的想吐了,才恶搞模仿下。结果,悲剧了,我的50块啊!!!(如果看到的话,把我那几个帖删了吧。)

我先发个我写的代码吧,可以列出四阶幻方。 demo-vba-四阶幻方.rar (18.49 KB, 下载次数: 41)

TA的精华主题

TA的得分主题

发表于 2017-2-7 23:25 | 显示全部楼层
Moneky 发表于 2017-2-7 23:19
@joforn 这玩意我还没法回复,只有这样了。我也是看那个人的帖看的想吐了,才恶搞模仿下。结果,悲剧了,我 ...

可以投诉,最好别模仿,放了他几个月就是想看看他会不会自已玩累了收手,今天一来就见到第一页全是清一色的这类帖,实在忍不了了。他现在的技术分比你高多了。

TA的精华主题

TA的得分主题

发表于 2017-2-8 00:30 | 显示全部楼层
香川群子 发表于 2017-2-7 20:31
每产生一次结果,都可以进行含自身的8种旋转、镜像对称。

刚刚随手凑了一组:

n阶幻方的计算式和是固定的(n*n+1)*n/2 吧……

TA的精华主题

TA的得分主题

发表于 2017-2-8 13:56 | 显示全部楼层
Huangyufei 发表于 2017-2-8 00:30
n阶幻方的计算式和是固定的(n*n+1)*n/2 吧……

嗯,是这样子。这个是有理论计算的吧。

TA的精华主题

TA的得分主题

发表于 2017-2-8 14:09 | 显示全部楼层
本帖最后由 香川群子 于 2017-2-8 22:28 编辑
Moneky 发表于 2017-2-7 23:19
@joforn 这玩意我还没法回复,只有这样了。我也是看那个人的帖看的想吐了,才恶搞模仿下。结果,悲剧了,我 ...

我写了递归代码。结果可能和你的不一样。

算法原理:
1. 已知方阵横竖斜总和=(4*4+1)*4/2=34
2. 生成1-16中所有任选4个的组合之和=34的结果,
    并按任意2个的排列填入数组a。(即可根据任选2个的组合快速得知满足和值=34的另2个值)

3. 分别设置1的位置为(1,1)(1,2)(2,2)【根据对称原理只有这3个位置是不重复的】
   然后用递归算法进行数据验证:
  3.1 任选1个数,然后根据数组a限制找到剩余2个数 填入横线、继续 (已确定4个数位置)
  3.2 任选1个数,然后根据数组a限制找到剩余2个数 填入斜线、继续 (已确定7个数位置)
  3.3 任选1个数,然后根据数组a限制找到剩余2个数 填入竖线、继续 (已确定10个数位置)
  3.3.1 任选1个数,然后根据数组a限制找到剩余2个数 填入第2横线、(已确定12个数位置)
  3.3.2 然后依次检查计算剩余的4个数、并逐个保证填入有效时,最后即可得到满足条件的解。
上述各个过程中如果有无效数则退出继续循环、递归计算。

这样最后得到1的3个位置共有880组不含镜像旋转对称的解。含镜像旋转对称一共是=880*8=7040组解。

更正bug以后,和楼主算出来的=7040组解取得了一致。


TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-8 14:50 | 显示全部楼层
本帖最后由 Moneky 于 2017-2-8 14:57 编辑
香川群子 发表于 2017-2-8 14:09
我写了递归代码。结果可能和你的不一样。

算法原理:

我的代码列出来是7040,没有排除旋转的情况,7040÷4=1760(与你上面的数据有出入,不确定是我漏掉了一些还是你多了一些)

我代码是:
1、列举出所有和为34的四个数组合
2、列出4组和为34,且恰好1-16各出现一次的的组合M
3、组合M每四个数看作一行,放入4×4中,交换各行的数,分别检查是否能够满足每列也为34
4、如果可以满足每列也为34,再整行交换,检查对角线是否为34

评分

参与人数 1鲜花 +2 收起 理由
hsw212 + 2 太强大了

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,高效办公专列,每天发车

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2019-8-22 18:26 , Processed in 0.098364 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表