幻方解法之Strachey法生成双偶幻方
/*
程序思想参考百度百科上"幻方法则" 2015-01-27
http://baike.baidu.com/link?url=7ynfkLYfGv4f7PtQkuH4PSn_8IFr_QFAN-Bnsk0hmd2uk6WITW7r1d8o7IQJ1IL3bNRHbpHYbVXpDAvNbyJBDK
其实在维基百科上有更全面的,搜索Magic square即可查到,可惜太英语了,有点难,留着以后看^*^
代码环境xcode6.1 playground
几个公用函数只在第一篇显示,后面的篇章不在重复
func isMagic(s:[[Int]])->[Int]?
func printMagic(s:[[Int]])
func signed(aint: Int)->Int
func correction(k: Int, step: Int) ->Int
*/
/*
2、Strachey法生成双偶幻方
第一步,将n阶双偶幻方表示为4m阶幻方。将其等分为四分,成为如下图所示A、B、C、D四个2m阶偶数幻方。
A C
D B
A用1至(2m)^2填写成2m阶幻方;B用(2m)^2+1至2*(2m)^2填写成2m阶幻方;C用2*(2m)^2+1至3*(2m)^2填写成2m阶幻方;D用3*(2m^)2+1至4*(2m)^2填写成2m阶幻方;
将8阶双偶幻方表示为4×2阶幻方。将其等分为四个2×2阶偶数幻方,即4阶偶数幻方。
16 2 3 13 48 34 35 45
5 11 10 8 37 43 42 40
9 7 6 12 41 39 38 44
4 14 15 1 36 46 47 33
64 50 51 61 32 18 19 29
53 59 58 56 21 27 26 24
57 55 54 60 25 23 22 28
52 62 63 49 20 30 31 17
第三步,在A每行取m个小格(一侧对角线格为必换格,其余m-1格只要不是另一侧对角线格即可),将其与D相应方格内交换;B与C以相同方法进行。
对于8阶幻方,A每行取2个小格(一侧对角线格为必换格,其余1格只要不是另一侧对角线格即可),要与D相应方格内交换;C与B以相同方法进行。
最简单的方法就是:A任意2列,与D相对应的2列互换,C任意2列,与B相对应的2列互换即可。
64 50 3 13 48 34 19 29
53 59 10 8 37 43 26 24
57 55 6 12 41 39 22 28
52 62 15 1 36 46 31 17
16 2 51 61 32 18 35 45
5 11 58 56 21 27 42 40
9 7 54 60 25 23 38 44
4 14 63 49 20 30 47 33
或
64 50 3 13 32 18 35 45
53 59 10 8 21 27 42 40
57 55 6 12 25 23 38 44
52 62 15 1 20 30 47 33
16 2 51 61 48 34 19 29
5 11 58 56 37 43 26 24
9 7 54 60 41 39 22 28
4 14 63 49 36 46 31 17
等等完成幻方,幻和值260。
*/
func SOStrachey(#subMagic:[[Int]])->([[Int]])?{
let subStep = subMagic.count
let step = subStep * 2
let aRow = [Int](count: step, repeatedValue: 0)
var solution = [[Int]](count: step, repeatedValue: aRow)
//填充s中一块区域,使之成为幻方, 起点为row,col 边长为substep
func fillSubMagic(inout s:[[Int]], #row0: Int, #col0: Int, #subMagic: [[Int]], var #iPut0:Int){
for var row = 0; row < subMagic.count; ++row{
for var col = 0; col < subMagic.count; ++col{
s[row0 + row][col0 + col] = subMagic[row][col] + iPut0
}
}
}
//第一步,初始化ABCD
fillSubMagic(&solution, row0: 0, col0: 0, subMagic: subMagic, iPut0: 1)
fillSubMagic(&solution, row0: step/2, col0: step/2, subMagic: subMagic, iPut0: step*step+1)
fillSubMagic(&solution, row0: 0, col0: step/2, subMagic: subMagic, iPut0: step*step*2+1)
fillSubMagic(&solution, row0: step/2, col0: 0, subMagic: subMagic, iPut0: step*step*3+1)
//第二步,在A每行取m个小格(一侧对角线格为必换格,其余m-1格只要不是另一侧对角线格即可),将其与D相应方格内交换;B与C以相同方法进行。
//row0,col0第一个子区域的起点, row1,col1第二个子区域的起点, subStep边长
func swapColumnDataInSubMagic(inout s:[[Int]], #row0: Int, #col0: Int, #row1: Int, #col1: Int, #subStep: Int){
for var row = 0; row < subStep; ++row{
for var col = 0; col < subStep/2; ++col{
let swaprow0 = row + row0
let swapcol0 = col + col0
let swaprow1 = row + row1
let swapcol1 = col + col1
let tmp = s[swaprow0][swapcol0]
s[swaprow0][swapcol0] = s[swaprow1][swapcol1]
s[swaprow1][swapcol1] = tmp
}
}
}
//A与D换前m列, B与C换前m列
swapColumnDataInSubMagic(&solution, row0: 0, col0: 0, row1: step/2, col1: 0, subStep: step/2)
swapColumnDataInSubMagic(&solution, row0: 0, col0: step/2, row1: step/2, col1: step/2, subStep: step/2)
return solution
}
//测试过程
func testSOStrachey(){
func checkMagic(magic:[[Int]]){
printMagic(magic)
let k = isMagic(magic)
if let k1 = k{
println("这个不是幻方 k=\(k1)")
}
}
println("来个8阶的")
let magic4 = SOSpring1(step: 4, swap00: true)
let magic8 = SOStrachey(subMagic: magic4!)
checkMagic(magic8!)
println("来个12阶的")
let magic3 = JJMerzirac(step: 3)
let magic6 = DOStrachey(subMagic: magic3!)
let magic12 = SOStrachey(subMagic: magic6!)
checkMagic(magic12!)
println("16阶的来一个")
let magic16 = SOStrachey(subMagic: magic8!)
checkMagic(magic16!)
}
//testSOStrachey()//打开即可打印
/*
来个8阶的
[209, 195, 4, 14, 81, 67, 132, 142]
[198, 204, 11, 9, 70, 76, 139, 137]
[202, 200, 7, 13, 74, 72, 135, 141]
[197, 207, 16, 2, 69, 79, 144, 130]
[17, 3, 196, 206, 145, 131, 68, 78]
[6, 12, 203, 201, 134, 140, 75, 73]
[10, 8, 199, 205, 138, 136, 71, 77]
[5, 15, 208, 194, 133, 143, 80, 66]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
来个12阶的
[550, 435, 440, 82, 75, 80, 262, 147, 152, 370, 363, 368]
[437, 547, 441, 77, 79, 81, 149, 259, 153, 365, 367, 369]
[546, 443, 436, 78, 83, 76, 258, 155, 148, 366, 371, 364]
[442, 543, 548, 46, 39, 44, 154, 255, 260, 334, 327, 332]
[545, 439, 549, 41, 43, 45, 257, 151, 261, 329, 331, 333]
[438, 551, 544, 42, 47, 40, 150, 263, 256, 330, 335, 328]
[118, 3, 8, 514, 507, 512, 406, 291, 296, 226, 219, 224]
[5, 115, 9, 509, 511, 513, 293, 403, 297, 221, 223, 225]
[114, 11, 4, 510, 515, 508, 402, 299, 292, 222, 227, 220]
[10, 111, 116, 478, 471, 476, 298, 399, 404, 190, 183, 188]
[113, 7, 117, 473, 475, 477, 401, 295, 405, 185, 187, 189]
[6, 119, 112, 474, 479, 472, 294, 407, 400, 186, 191, 184]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
16阶的来一个
[978, 964, 773, 783, 82, 68, 133, 143, 466, 452, 261, 271, 594, 580, 645, 655]
[967, 973, 780, 778, 71, 77, 140, 138, 455, 461, 268, 266, 583, 589, 652, 650]
[971, 969, 776, 782, 75, 73, 136, 142, 459, 457, 264, 270, 587, 585, 648, 654]
[966, 976, 785, 771, 70, 80, 145, 131, 454, 464, 273, 259, 582, 592, 657, 643]
[786, 772, 965, 975, 146, 132, 69, 79, 274, 260, 453, 463, 658, 644, 581, 591]
[775, 781, 972, 970, 135, 141, 76, 74, 263, 269, 460, 458, 647, 653, 588, 586]
[779, 777, 968, 974, 139, 137, 72, 78, 267, 265, 456, 462, 651, 649, 584, 590]
[774, 784, 977, 963, 134, 144, 81, 67, 262, 272, 465, 451, 646, 656, 593, 579]
[210, 196, 5, 15, 850, 836, 901, 911, 722, 708, 517, 527, 338, 324, 389, 399]
[199, 205, 12, 10, 839, 845, 908, 906, 711, 717, 524, 522, 327, 333, 396, 394]
[203, 201, 8, 14, 843, 841, 904, 910, 715, 713, 520, 526, 331, 329, 392, 398]
[198, 208, 17, 3, 838, 848, 913, 899, 710, 720, 529, 515, 326, 336, 401, 387]
[18, 4, 197, 207, 914, 900, 837, 847, 530, 516, 709, 719, 402, 388, 325, 335]
[7, 13, 204, 202, 903, 909, 844, 842, 519, 525, 716, 714, 391, 397, 332, 330]
[11, 9, 200, 206, 907, 905, 840, 846, 523, 521, 712, 718, 395, 393, 328, 334]
[6, 16, 209, 195, 902, 912, 849, 835, 518, 528, 721, 707, 390, 400, 337, 323]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
*/
幻方解法之Strachey法生成双偶幻方相关推荐
- 幻方解法之horse法生成奇阶幻方
/* 程序思想参考百度百科上"幻方法则" 2015-01-27 http://baike.baidu.com/link?url=7ynfkLYfGv4f7PtQkuH4PSn_8I ...
- 双偶幻方的c语言算法,单偶阶、双偶阶幻方的巧妙填法
单偶阶.双偶阶幻方的巧妙填法 单偶阶.双偶阶幻方的巧妙填法 人气:150 ℃时间:2019-12-07 19:18:09 优质解答 一.双偶幻方的解法 能被4整除的n阶幻方叫双偶幻方,如8阶.12阶. ...
- 任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。
幻方分为3类.奇阶幻方(奇数).双偶幻方(能够被4整除,如8,12,16--).单偶幻方(4m+2形式,如6,10--),构造算法各不相同. 下面的程序中,奇阶幻方的构造算法为Merzirac法.双偶 ...
- 【矩阵篇】九宫图/n宫图生成——Merzirac法生成奇阶幻方 Python实现
Merzirac法 当n为奇数时,我们称幻方为奇阶幻方. Merzirac法生成奇阶幻方: 在第一行居中的方格内放1 以后按顺序,向右斜上方填写数字.(称为斜步) 若出到方阵上方,把该数字填到本该所在 ...
- 重温c语言 谭浩强 输出魔方阵 目前只做了基数魔方 以及 双偶幻方,单偶同理
基数魔方阵 1>第一行中间位取值1 2>然后 后面的n*n -1 个数按以下规则 下一个数是前一个数的 行-1 列 +1 若是行是0 则为n-1:若列是n-1,则为0:若定位后的pos ...
- 最快的单偶幻方构建法
--单偶幻方跳格法(修改稿) 单偶幻方最经典的方法,是斯特雷奇法.该方法以连摆法为基础,但换位较多,需要换位n/2-2列.阶数增高,换位的列会增加许多.尽管此法不甚完美,人们就这样趔趔趄趄着,用了10 ...
- 任意阶幻方解法及c++实现
任意阶幻方的解法及c++实现 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行.一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为"幻方".我国古代称为" ...
- 11-Little prince's trip to Java-偶数魔方阵之双偶魔方阵
偶数魔方阵分为两种:① 双偶魔方阵 ② 单偶魔方阵 双偶魔方阵 n为偶数,且能被4整除 (n=4,8,12,16,20--) (n=4k,k=1,2,3,4,5--) 阶数为4时: 互补:如果两个数字 ...
- 2021-01-07 matlab数值分析 线性方程组的迭代解法 高斯-赛德尔迭代法
matlab数值分析 线性方程组的迭代解法 高斯-赛德尔迭代法 Function [x,iter]=gs(A,b,tol) D=diag(diag(A)); L=D-tril(A); U=D-triu ...
最新文章
- AngularJS学习笔记(3)——通过Ajax获取JSON数据
- 【转】java线程系列---Runnable和Thread的区别
- html学习_认识html
- python turtle 颜色数字_python的绘图利器--海龟绘图turtle
- SAP Cloud for Customer里新的Lead UI对Mashup集成的支持原理
- 栈和排序(贪心+思维)
- Loj#143-[模板]质数判定【Miller-Rabin】
- 一般算术表达式转换成后缀式
- esx4克隆后的处理工作
- 软件架构师常会用到的几款软件
- NfcA/NfcB/NfcF/NfcV/IsoDep/Ndef/Mifare/Felica/Pboc/ISOxxxx 标签格式及标准
- Android 处理软键盘遮挡问题
- V4L2 pixel format 格式参考
- 奇迹暖暖安卓鸿蒙互通吗,奇迹暖暖安卓和ios互通吗 奇迹暖暖苹果和安卓能一起玩吗...
- radio、checkbox在使用iCheck后,绑定选中事件
- 关于u盘插入电脑在我的电脑中不显示盘符无法正常使用,但是在右下角图标有显示的问题。
- Zigzag小整数压缩算法
- “智医助理”噱头>实用性?详解科大讯飞医疗新布局
- 2021年1月程序员工资统计,平均14915元
- 2013~2014 第一学期课件整理
热门文章
- 谷歌Adsende中的 CPC、CTR、PRM含义
- xlrd,xlwt操作excel个人总结 自动化办公
- 医学计算机课程标准,《医学影像诊断学》课程标准.doc
- 苹果11微信表格服务器地址怎么填,苹果实用技巧:iPhone11手机微信打字怎么换行...
- 阿里云国际版查看云服务器ecs实例系统日志和截图-Unirech
- SD/SDHC/SDXC区别
- 武则天用无字碑深切蔑视男人
- 轻奢消费人群画像报告
- 怎样用手机照出证件照
- 《匆匆那年》的你,还记得吗?数学中的那些有(hui)趣(se)的定理(14)——毛球定理(Hairy ball theorem)