/*
程序思想参考百度百科上"幻方法则" 2015-01-27
其实在维基百科上有更全面的,搜索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
*/
//看了前面几篇,大家也看出来了,不管几阶,只要大于等于3,都是有解的,而且很多都是有不同的解法
//不过在需要用时再去想用哪个方法,貌似有点伤脑筋
//不如简单写成一个方法,当需要几阶时,直接就给个解
func CreateMagic(step: Int) -> ([[Int]])?{
if step < 3 {return nil}
if (step % 2 != 0){
return JJMerzirac(step: step)
}else if (step % 4 == 0){
return SOSpring1(step: step, swap00: true)
}else if (step % 2 == 0){
return DOStrachey(subMagic: JJMerzirac(step: step/2)!)
}else{
println("这里不会进来的")
return nil
}
}
//测试
func testCreateMagic(){
func testStep(step: Int){
let s = CreateMagic(step)
if let s1 = s{
printMagic(s1)
let k = isMagic(s1)
if let k1 = k{
println("这个不是幻方 k=\(k1)")
}
}else{
println("没有生成幻方 step=\(step)")
}
}
let time1 = NSDate()
for var i = 3; i<20; ++i{
println("\n\(i)阶幻方")
testStep(i)
}
let time2 = NSDate()
println("time1=\(time1)")
println("time2=\(time2)")
}
//testCreateMagic()
/*
3阶幻方
[8, 1, 6]
[3, 5, 7]
[4, 9, 2]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
4阶幻方
[16, 2, 3, 13]
[5, 11, 10, 8]
[9, 7, 6, 12]
[4, 14, 15, 1]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
5阶幻方
[17, 24, 1, 8, 15]
[23, 5, 7, 14, 16]
[4, 6, 13, 20, 22]
[10, 12, 19, 21, 3]
[11, 18, 25, 2, 9]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
6阶幻方
[117, 2, 7, 81, 74, 79]
[4, 114, 8, 76, 78, 80]
[113, 10, 3, 77, 82, 75]
[9, 110, 115, 45, 38, 43]
[112, 6, 116, 40, 42, 44]
[5, 118, 111, 41, 46, 39]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
7阶幻方
[30, 39, 48, 1, 10, 19, 28]
[38, 47, 7, 9, 18, 27, 29]
[46, 6, 8, 17, 26, 35, 37]
[5, 14, 16, 25, 34, 36, 45]
[13, 15, 24, 33, 42, 44, 4]
[21, 23, 32, 41, 43, 3, 12]
[22, 31, 40, 49, 2, 11, 20]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
8阶幻方
[64, 2, 62, 4, 5, 59, 7, 57]
[9, 55, 11, 53, 52, 14, 50, 16]
[48, 18, 46, 20, 21, 43, 23, 41]
[25, 39, 27, 37, 36, 30, 34, 32]
[33, 31, 35, 29, 28, 38, 26, 40]
[24, 42, 22, 44, 45, 19, 47, 17]
[49, 15, 51, 13, 12, 54, 10, 56]
[8, 58, 6, 60, 61, 3, 63, 1]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
9阶幻方
[47, 58, 69, 80, 1, 12, 23, 34, 45]
[57, 68, 79, 9, 11, 22, 33, 44, 46]
[67, 78, 8, 10, 21, 32, 43, 54, 56]
[77, 7, 18, 20, 31, 42, 53, 55, 66]
[6, 17, 19, 30, 41, 52, 63, 65, 76]
[16, 27, 29, 40, 51, 62, 64, 75, 5]
[26, 28, 39, 50, 61, 72, 74, 4, 15]
[36, 38, 49, 60, 71, 73, 3, 14, 25]
[37, 48, 59, 70, 81, 2, 13, 24, 35]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
10阶幻方
[318, 325, 2, 9, 16, 218, 225, 202, 209, 116]
[324, 306, 8, 15, 17, 224, 206, 208, 215, 117]
[305, 7, 314, 21, 23, 205, 207, 214, 221, 123]
[311, 313, 20, 22, 4, 211, 213, 220, 222, 104]
[312, 319, 26, 3, 10, 212, 219, 226, 203, 110]
[18, 25, 302, 309, 316, 118, 125, 102, 109, 216]
[24, 6, 308, 315, 317, 124, 106, 108, 115, 217]
[5, 307, 14, 321, 323, 105, 107, 114, 121, 223]
[11, 13, 320, 322, 304, 111, 113, 120, 122, 204]
[12, 19, 326, 303, 310, 112, 119, 126, 103, 210]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
11阶幻方
[68, 81, 94, 107, 120, 1, 14, 27, 40, 53, 66]
[80, 93, 106, 119, 11, 13, 26, 39, 52, 65, 67]
[92, 105, 118, 10, 12, 25, 38, 51, 64, 77, 79]
[104, 117, 9, 22, 24, 37, 50, 63, 76, 78, 91]
[116, 8, 21, 23, 36, 49, 62, 75, 88, 90, 103]
[7, 20, 33, 35, 48, 61, 74, 87, 89, 102, 115]
[19, 32, 34, 47, 60, 73, 86, 99, 101, 114, 6]
[31, 44, 46, 59, 72, 85, 98, 100, 113, 5, 18]
[43, 45, 58, 71, 84, 97, 110, 112, 4, 17, 30]
[55, 57, 70, 83, 96, 109, 111, 3, 16, 29, 42]
[56, 69, 82, 95, 108, 121, 2, 15, 28, 41, 54]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
12阶幻方
[144, 2, 142, 4, 140, 6, 7, 137, 9, 135, 11, 133]
[13, 131, 15, 129, 17, 127, 126, 20, 124, 22, 122, 24]
[120, 26, 118, 28, 116, 30, 31, 113, 33, 111, 35, 109]
[37, 107, 39, 105, 41, 103, 102, 44, 100, 46, 98, 48]
[96, 50, 94, 52, 92, 54, 55, 89, 57, 87, 59, 85]
[61, 83, 63, 81, 65, 79, 78, 68, 76, 70, 74, 72]
[73, 71, 75, 69, 77, 67, 66, 80, 64, 82, 62, 84]
[60, 86, 58, 88, 56, 90, 91, 53, 93, 51, 95, 49]
[97, 47, 99, 45, 101, 43, 42, 104, 40, 106, 38, 108]
[36, 110, 34, 112, 32, 114, 115, 29, 117, 27, 119, 25]
[121, 23, 123, 21, 125, 19, 18, 128, 16, 130, 14, 132]
[12, 134, 10, 136, 8, 138, 139, 5, 141, 3, 143, 1]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
13阶幻方
[93, 108, 123, 138, 153, 168, 1, 16, 31, 46, 61, 76, 91]
[107, 122, 137, 152, 167, 13, 15, 30, 45, 60, 75, 90, 92]
[121, 136, 151, 166, 12, 14, 29, 44, 59, 74, 89, 104, 106]
[135, 150, 165, 11, 26, 28, 43, 58, 73, 88, 103, 105, 120]
[149, 164, 10, 25, 27, 42, 57, 72, 87, 102, 117, 119, 134]
[163, 9, 24, 39, 41, 56, 71, 86, 101, 116, 118, 133, 148]
[8, 23, 38, 40, 55, 70, 85, 100, 115, 130, 132, 147, 162]
[22, 37, 52, 54, 69, 84, 99, 114, 129, 131, 146, 161, 7]
[36, 51, 53, 68, 83, 98, 113, 128, 143, 145, 160, 6, 21]
[50, 65, 67, 82, 97, 112, 127, 142, 144, 159, 5, 20, 35]
[64, 66, 81, 96, 111, 126, 141, 156, 158, 4, 19, 34, 49]
[78, 80, 95, 110, 125, 140, 155, 157, 3, 18, 33, 48, 63]
[79, 94, 109, 124, 139, 154, 169, 2, 17, 32, 47, 62, 77]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
14阶幻方
[619, 628, 637, 2, 11, 20, 29, 423, 432, 441, 394, 403, 216, 225]
[627, 636, 596, 10, 19, 28, 30, 431, 440, 400, 402, 411, 224, 226]
[635, 595, 597, 18, 27, 36, 38, 439, 399, 401, 410, 419, 232, 234]
[594, 603, 17, 614, 35, 37, 46, 398, 407, 409, 418, 427, 233, 242]
[602, 604, 613, 34, 43, 45, 5, 406, 408, 417, 426, 435, 241, 201]
[610, 612, 621, 42, 44, 4, 13, 414, 416, 425, 434, 436, 200, 209]
[611, 620, 629, 50, 3, 12, 21, 415, 424, 433, 442, 395, 208, 217]
[31, 40, 49, 590, 599, 608, 617, 227, 236, 245, 198, 207, 412, 421]
[39, 48, 8, 598, 607, 616, 618, 235, 244, 204, 206, 215, 420, 422]
[47, 7, 9, 606, 615, 624, 626, 243, 203, 205, 214, 223, 428, 430]
[6, 15, 605, 26, 623, 625, 634, 202, 211, 213, 222, 231, 429, 438]
[14, 16, 25, 622, 631, 633, 593, 210, 212, 221, 230, 239, 437, 397]
[22, 24, 33, 630, 632, 592, 601, 218, 220, 229, 238, 240, 396, 405]
[23, 32, 41, 638, 591, 600, 609, 219, 228, 237, 246, 199, 404, 413]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
15阶幻方
[122, 139, 156, 173, 190, 207, 224, 1, 18, 35, 52, 69, 86, 103, 120]
[138, 155, 172, 189, 206, 223, 15, 17, 34, 51, 68, 85, 102, 119, 121]
[154, 171, 188, 205, 222, 14, 16, 33, 50, 67, 84, 101, 118, 135, 137]
[170, 187, 204, 221, 13, 30, 32, 49, 66, 83, 100, 117, 134, 136, 153]
[186, 203, 220, 12, 29, 31, 48, 65, 82, 99, 116, 133, 150, 152, 169]
[202, 219, 11, 28, 45, 47, 64, 81, 98, 115, 132, 149, 151, 168, 185]
[218, 10, 27, 44, 46, 63, 80, 97, 114, 131, 148, 165, 167, 184, 201]
[9, 26, 43, 60, 62, 79, 96, 113, 130, 147, 164, 166, 183, 200, 217]
[25, 42, 59, 61, 78, 95, 112, 129, 146, 163, 180, 182, 199, 216, 8]
[41, 58, 75, 77, 94, 111, 128, 145, 162, 179, 181, 198, 215, 7, 24]
[57, 74, 76, 93, 110, 127, 144, 161, 178, 195, 197, 214, 6, 23, 40]
[73, 90, 92, 109, 126, 143, 160, 177, 194, 196, 213, 5, 22, 39, 56]
[89, 91, 108, 125, 142, 159, 176, 193, 210, 212, 4, 21, 38, 55, 72]
[105, 107, 124, 141, 158, 175, 192, 209, 211, 3, 20, 37, 54, 71, 88]
[106, 123, 140, 157, 174, 191, 208, 225, 2, 19, 36, 53, 70, 87, 104]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
16阶幻方
[256, 2, 254, 4, 252, 6, 250, 8, 9, 247, 11, 245, 13, 243, 15, 241]
[17, 239, 19, 237, 21, 235, 23, 233, 232, 26, 230, 28, 228, 30, 226, 32]
[224, 34, 222, 36, 220, 38, 218, 40, 41, 215, 43, 213, 45, 211, 47, 209]
[49, 207, 51, 205, 53, 203, 55, 201, 200, 58, 198, 60, 196, 62, 194, 64]
[192, 66, 190, 68, 188, 70, 186, 72, 73, 183, 75, 181, 77, 179, 79, 177]
[81, 175, 83, 173, 85, 171, 87, 169, 168, 90, 166, 92, 164, 94, 162, 96]
[160, 98, 158, 100, 156, 102, 154, 104, 105, 151, 107, 149, 109, 147, 111, 145]
[113, 143, 115, 141, 117, 139, 119, 137, 136, 122, 134, 124, 132, 126, 130, 128]
[129, 127, 131, 125, 133, 123, 135, 121, 120, 138, 118, 140, 116, 142, 114, 144]
[112, 146, 110, 148, 108, 150, 106, 152, 153, 103, 155, 101, 157, 99, 159, 97]
[161, 95, 163, 93, 165, 91, 167, 89, 88, 170, 86, 172, 84, 174, 82, 176]
[80, 178, 78, 180, 76, 182, 74, 184, 185, 71, 187, 69, 189, 67, 191, 65]
[193, 63, 195, 61, 197, 59, 199, 57, 56, 202, 54, 204, 52, 206, 50, 208]
[48, 210, 46, 212, 44, 214, 42, 216, 217, 39, 219, 37, 221, 35, 223, 33]
[225, 31, 227, 29, 229, 27, 231, 25, 24, 234, 22, 236, 20, 238, 18, 240]
[16, 242, 14, 244, 12, 246, 10, 248, 249, 7, 251, 5, 253, 3, 255, 1]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
17阶幻方
[155, 174, 193, 212, 231, 250, 269, 288, 1, 20, 39, 58, 77, 96, 115, 134, 153]
[173, 192, 211, 230, 249, 268, 287, 17, 19, 38, 57, 76, 95, 114, 133, 152, 154]
[191, 210, 229, 248, 267, 286, 16, 18, 37, 56, 75, 94, 113, 132, 151, 170, 172]
[209, 228, 247, 266, 285, 15, 34, 36, 55, 74, 93, 112, 131, 150, 169, 171, 190]
[227, 246, 265, 284, 14, 33, 35, 54, 73, 92, 111, 130, 149, 168, 187, 189, 208]
[245, 264, 283, 13, 32, 51, 53, 72, 91, 110, 129, 148, 167, 186, 188, 207, 226]
[263, 282, 12, 31, 50, 52, 71, 90, 109, 128, 147, 166, 185, 204, 206, 225, 244]
[281, 11, 30, 49, 68, 70, 89, 108, 127, 146, 165, 184, 203, 205, 224, 243, 262]
[10, 29, 48, 67, 69, 88, 107, 126, 145, 164, 183, 202, 221, 223, 242, 261, 280]
[28, 47, 66, 85, 87, 106, 125, 144, 163, 182, 201, 220, 222, 241, 260, 279, 9]
[46, 65, 84, 86, 105, 124, 143, 162, 181, 200, 219, 238, 240, 259, 278, 8, 27]
[64, 83, 102, 104, 123, 142, 161, 180, 199, 218, 237, 239, 258, 277, 7, 26, 45]
[82, 101, 103, 122, 141, 160, 179, 198, 217, 236, 255, 257, 276, 6, 25, 44, 63]
[100, 119, 121, 140, 159, 178, 197, 216, 235, 254, 256, 275, 5, 24, 43, 62, 81]
[118, 120, 139, 158, 177, 196, 215, 234, 253, 272, 274, 4, 23, 42, 61, 80, 99]
[136, 138, 157, 176, 195, 214, 233, 252, 271, 273, 3, 22, 41, 60, 79, 98, 117]
[137, 156, 175, 194, 213, 232, 251, 270, 289, 2, 21, 40, 59, 78, 97, 116, 135]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
18阶幻方
[1020, 1031, 1042, 1053, 2, 13, 24, 35, 46, 696, 707, 718, 729, 650, 661, 348, 359, 370]
[1030, 1041, 1052, 982, 12, 23, 34, 45, 47, 706, 717, 728, 658, 660, 671, 358, 369, 371]
[1040, 1051, 981, 983, 22, 33, 44, 55, 57, 716, 727, 657, 659, 670, 681, 368, 379, 381]
[1050, 980, 991, 993, 32, 43, 54, 56, 67, 726, 656, 667, 669, 680, 691, 378, 380, 391]
[979, 990, 992, 31, 1014, 53, 64, 66, 77, 655, 666, 668, 679, 690, 701, 388, 390, 401]
[989, 1000, 1002, 1013, 52, 63, 65, 76, 6, 665, 676, 678, 689, 700, 711, 389, 400, 330]
[999, 1001, 1012, 1023, 62, 73, 75, 5, 16, 675, 677, 688, 699, 710, 721, 399, 329, 340]
[1009, 1011, 1022, 1033, 72, 74, 4, 15, 26, 685, 687, 698, 709, 720, 722, 328, 339, 350]
[1010, 1021, 1032, 1043, 82, 3, 14, 25, 36, 686, 697, 708, 719, 730, 651, 338, 349, 360]
[48, 59, 70, 81, 974, 985, 996, 1007, 1018, 372, 383, 394, 405, 326, 337, 672, 683, 694]
[58, 69, 80, 10, 984, 995, 1006, 1017, 1019, 382, 393, 404, 334, 336, 347, 682, 693, 695]
[68, 79, 9, 11, 994, 1005, 1016, 1027, 1029, 392, 403, 333, 335, 346, 357, 692, 703, 705]
[78, 8, 19, 21, 1004, 1015, 1026, 1028, 1039, 402, 332, 343, 345, 356, 367, 702, 704, 715]
[7, 18, 20, 1003, 42, 1025, 1036, 1038, 1049, 331, 342, 344, 355, 366, 377, 712, 714, 725]
[17, 28, 30, 41, 1024, 1035, 1037, 1048, 978, 341, 352, 354, 365, 376, 387, 713, 724, 654]
[27, 29, 40, 51, 1034, 1045, 1047, 977, 988, 351, 353, 364, 375, 386, 397, 723, 653, 664]
[37, 39, 50, 61, 1044, 1046, 976, 987, 998, 361, 363, 374, 385, 396, 398, 652, 663, 674]
[38, 49, 60, 71, 1054, 975, 986, 997, 1008, 362, 373, 384, 395, 406, 327, 662, 673, 684]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
19阶幻方
[192, 213, 234, 255, 276, 297, 318, 339, 360, 1, 22, 43, 64, 85, 106, 127, 148, 169, 190]
[212, 233, 254, 275, 296, 317, 338, 359, 19, 21, 42, 63, 84, 105, 126, 147, 168, 189, 191]
[232, 253, 274, 295, 316, 337, 358, 18, 20, 41, 62, 83, 104, 125, 146, 167, 188, 209, 211]
[252, 273, 294, 315, 336, 357, 17, 38, 40, 61, 82, 103, 124, 145, 166, 187, 208, 210, 231]
[272, 293, 314, 335, 356, 16, 37, 39, 60, 81, 102, 123, 144, 165, 186, 207, 228, 230, 251]
[292, 313, 334, 355, 15, 36, 57, 59, 80, 101, 122, 143, 164, 185, 206, 227, 229, 250, 271]
[312, 333, 354, 14, 35, 56, 58, 79, 100, 121, 142, 163, 184, 205, 226, 247, 249, 270, 291]
[332, 353, 13, 34, 55, 76, 78, 99, 120, 141, 162, 183, 204, 225, 246, 248, 269, 290, 311]
[352, 12, 33, 54, 75, 77, 98, 119, 140, 161, 182, 203, 224, 245, 266, 268, 289, 310, 331]
[11, 32, 53, 74, 95, 97, 118, 139, 160, 181, 202, 223, 244, 265, 267, 288, 309, 330, 351]
[31, 52, 73, 94, 96, 117, 138, 159, 180, 201, 222, 243, 264, 285, 287, 308, 329, 350, 10]
[51, 72, 93, 114, 116, 137, 158, 179, 200, 221, 242, 263, 284, 286, 307, 328, 349, 9, 30]
[71, 92, 113, 115, 136, 157, 178, 199, 220, 241, 262, 283, 304, 306, 327, 348, 8, 29, 50]
[91, 112, 133, 135, 156, 177, 198, 219, 240, 261, 282, 303, 305, 326, 347, 7, 28, 49, 70]
[111, 132, 134, 155, 176, 197, 218, 239, 260, 281, 302, 323, 325, 346, 6, 27, 48, 69, 90]
[131, 152, 154, 175, 196, 217, 238, 259, 280, 301, 322, 324, 345, 5, 26, 47, 68, 89, 110]
[151, 153, 174, 195, 216, 237, 258, 279, 300, 321, 342, 344, 4, 25, 46, 67, 88, 109, 130]
[171, 173, 194, 215, 236, 257, 278, 299, 320, 341, 343, 3, 24, 45, 66, 87, 108, 129, 150]
[172, 193, 214, 235, 256, 277, 298, 319, 340, 361, 2, 23, 44, 65, 86, 107, 128, 149, 170]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
time1=2015-01-29 07:11:59 +0000
time2=2015-01-29 07:12:31 +0000
*/