/*

程序思想参考百度百科上"幻方法则" 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法生成双偶幻方相关推荐

  1. 幻方解法之horse法生成奇阶幻方

    /* 程序思想参考百度百科上"幻方法则" 2015-01-27 http://baike.baidu.com/link?url=7ynfkLYfGv4f7PtQkuH4PSn_8I ...

  2. 双偶幻方的c语言算法,单偶阶、双偶阶幻方的巧妙填法

    单偶阶.双偶阶幻方的巧妙填法 单偶阶.双偶阶幻方的巧妙填法 人气:150 ℃时间:2019-12-07 19:18:09 优质解答 一.双偶幻方的解法 能被4整除的n阶幻方叫双偶幻方,如8阶.12阶. ...

  3. 任意阶幻方的c++实现----奇阶幻方、双偶幻方、单偶幻方。

    幻方分为3类.奇阶幻方(奇数).双偶幻方(能够被4整除,如8,12,16--).单偶幻方(4m+2形式,如6,10--),构造算法各不相同. 下面的程序中,奇阶幻方的构造算法为Merzirac法.双偶 ...

  4. 【矩阵篇】九宫图/n宫图生成——Merzirac法生成奇阶幻方 Python实现

    Merzirac法 当n为奇数时,我们称幻方为奇阶幻方. Merzirac法生成奇阶幻方: 在第一行居中的方格内放1 以后按顺序,向右斜上方填写数字.(称为斜步) 若出到方阵上方,把该数字填到本该所在 ...

  5. 重温c语言 谭浩强 输出魔方阵 目前只做了基数魔方 以及 双偶幻方,单偶同理

    基数魔方阵 1>第一行中间位取值1 2>然后 后面的n*n -1 个数按以下规则 下一个数是前一个数的  行-1 列 +1  若是行是0 则为n-1:若列是n-1,则为0:若定位后的pos ...

  6. 最快的单偶幻方构建法

    --单偶幻方跳格法(修改稿) 单偶幻方最经典的方法,是斯特雷奇法.该方法以连摆法为基础,但换位较多,需要换位n/2-2列.阶数增高,换位的列会增加许多.尽管此法不甚完美,人们就这样趔趔趄趄着,用了10 ...

  7. 任意阶幻方解法及c++实现

    任意阶幻方的解法及c++实现 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行.一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为"幻方".我国古代称为" ...

  8. 11-Little prince's trip to Java-偶数魔方阵之双偶魔方阵

    偶数魔方阵分为两种:① 双偶魔方阵 ② 单偶魔方阵 双偶魔方阵 n为偶数,且能被4整除 (n=4,8,12,16,20--) (n=4k,k=1,2,3,4,5--) 阶数为4时: 互补:如果两个数字 ...

  9. 2021-01-07 matlab数值分析 线性方程组的迭代解法 高斯-赛德尔迭代法

    matlab数值分析 线性方程组的迭代解法 高斯-赛德尔迭代法 Function [x,iter]=gs(A,b,tol) D=diag(diag(A)); L=D-tril(A); U=D-triu ...

最新文章

  1. AngularJS学习笔记(3)——通过Ajax获取JSON数据
  2. 【转】java线程系列---Runnable和Thread的区别
  3. html学习_认识html
  4. python turtle 颜色数字_python的绘图利器--海龟绘图turtle
  5. SAP Cloud for Customer里新的Lead UI对Mashup集成的支持原理
  6. 栈和排序(贪心+思维)
  7. Loj#143-[模板]质数判定【Miller-Rabin】
  8. 一般算术表达式转换成后缀式
  9. esx4克隆后的处理工作
  10. 软件架构师常会用到的几款软件
  11. NfcA/NfcB/NfcF/NfcV/IsoDep/Ndef/Mifare/Felica/Pboc/ISOxxxx 标签格式及标准
  12. Android 处理软键盘遮挡问题
  13. V4L2 pixel format 格式参考
  14. 奇迹暖暖安卓鸿蒙互通吗,奇迹暖暖安卓和ios互通吗 奇迹暖暖苹果和安卓能一起玩吗...
  15. radio、checkbox在使用iCheck后,绑定选中事件
  16. 关于u盘插入电脑在我的电脑中不显示盘符无法正常使用,但是在右下角图标有显示的问题。
  17. Zigzag小整数压缩算法
  18. “智医助理”噱头>实用性?详解科大讯飞医疗新布局
  19. 2021年1月程序员工资统计,平均14915元
  20. 2013~2014 第一学期课件整理

热门文章

  1. 谷歌Adsende中的 CPC、CTR、PRM含义
  2. xlrd,xlwt操作excel个人总结 自动化办公
  3. 医学计算机课程标准,《医学影像诊断学》课程标准.doc
  4. 苹果11微信表格服务器地址怎么填,苹果实用技巧:iPhone11手机微信打字怎么换行...
  5. 阿里云国际版查看云服务器ecs实例系统日志和截图-Unirech
  6. SD/SDHC/SDXC区别
  7. 武则天用无字碑深切蔑视男人
  8. 轻奢消费人群画像报告
  9. 怎样用手机照出证件照
  10. 《匆匆那年》的你,还记得吗?数学中的那些有(hui)趣(se)的定理(14)——毛球定理(Hairy ball theorem)