幻方解法之horse法生成奇阶幻方
来源:互联网 发布:在手机淘宝上怎样申诉 编辑:程序博客网 时间:2024/04/30 06:11
/*
程序思想参考百度百科上"幻方法则" 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
*/
/*
三、horse法生成奇阶幻方
对于所有的奇阶幻方,在第一行居中的方格内放1,向右走1步,下走2步以跳马步,依次填入2、3、4…,若出到方阵下方,把该数字填到本该填数所在列上方相应的格;若出到方阵右方,把该数字填到本该填数所在行的左方相应的格;如果落步格已有数字,则向下移一格继续填写。如下图用Horse法生成的5阶幻方:
23 12 1 20 9
4 18 7 21 15
10 24 13 2 16
11 5 19 8 22
17 6 25 14 3
*/
func JJHorse1(#step:Int) -> ([[Int]])?{
if (step <3) {returnnil}
if (step %2 ==0) {returnnil}
let aRow = [Int](count: step, repeatedValue:0)
var solution = [[Int]](count: step, repeatedValue: aRow)
//要赋值的位置
var row =0
var col = step/2
var iPut =1 //放这个数
solution[row][col] = iPut++
var time = step * step -1
do{
//下一个赋值的位置
var nextcol = col +1
var nextrow = row +2
nextcol =correction(nextcol,step)
nextrow =correction(nextrow,step)
if solution[nextrow][nextcol] !=0{
nextrow = row +1
nextrow =correction(nextrow,step)
nextcol = col
if solution[nextrow][col] !=0{
return solution
}
}
row = nextrow
col = nextcol
solution[row][col] = iPut++
}while(time-- >0)
return nil
}
//测试过程
func testJJHorse1(){
func testAStep(step:Int){
let s =JJHorse1(step: step)
iflet s1 = s{
printMagic(s1)
let k =isMagic(s1)
iflet k1 = k{
println("这个不是幻方 k=\(k1)")
}
}else{
println("s is not a magic square step =\(step)")
}
}
testAStep(3)
testAStep(5)
testAStep(7)
testAStep(9)
testAStep(11)
}
//testJJHorse1()
/*
[8, 1, 6]
[3, 5, 7]
[4, 9, 2]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[23, 12, 1, 20, 9]
[4, 18, 7, 21, 15]
[10, 24, 13, 2, 16]
[11, 5, 19, 8, 22]
[17, 6, 25, 14, 3]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[46, 31, 16, 1, 42, 27, 12]
[5, 39, 24, 9, 43, 35, 20]
[13, 47, 32, 17, 2, 36, 28]
[21, 6, 40, 25, 10, 44, 29]
[22, 14, 48, 33, 18, 3, 37]
[30, 15, 7, 41, 26, 11, 45]
[38, 23, 8, 49, 34, 19, 4]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[77, 58, 39, 20, 1, 72, 53, 34, 15]
[6, 68, 49, 30, 11, 73, 63, 44, 25]
[16, 78, 59, 40, 21, 2, 64, 54, 35]
[26, 7, 69, 50, 31, 12, 74, 55, 45]
[36, 17, 79, 60, 41, 22, 3, 65, 46]
[37, 27, 8, 70, 51, 32, 13, 75, 56]
[47, 28, 18, 80, 61, 42, 23, 4, 66]
[57, 38, 19, 9, 71, 52, 33, 14, 76]
[67, 48, 29, 10, 81, 62, 43, 24, 5]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[116, 93, 70, 47, 24, 1, 110, 87, 64, 41, 18]
[7, 105, 82, 59, 36, 13, 111, 99, 76, 53, 30]
[19, 117, 94, 71, 48, 25, 2, 100, 88, 65, 42]
[31, 8, 106, 83, 60, 37, 14, 112, 89, 77, 54]
[43, 20, 118, 95, 72, 49, 26, 3, 101, 78, 66]
[55, 32, 9, 107, 84, 61, 38, 15, 113, 90, 67]
[56, 44, 21, 119, 96, 73, 50, 27, 4, 102, 79]
[68, 45, 33, 10, 108, 85, 62, 39, 16, 114, 91]
[80, 57, 34, 22, 120, 97, 74, 51, 28, 5, 103]
[92, 69, 46, 23, 11, 109, 86, 63, 40, 17, 115]
[104, 81, 58, 35, 12, 121, 98, 75, 52, 29, 6]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
*/
/*
n阶奇阶幻方,若n为不是3的倍数,那么在任意一格内放1,向右走1步,以跳马步下走2步,依次填入2、3、4…,若出到方阵下方,就把该数字填到本该填数所在列上方相应的格内;若出到方阵右方,就把该数字填到本该填数所在行的左方相应的格内;如果落步格已有数字,则向上移一格继续填写。如下图所示,用Horse法生成的5阶幻方:
1 14 22 10 18
25 8 16 4 12
19 2 15 23 6
13 21 9 17 5
7 20 3 11 24
*/
func JJHorse2(#step:Int, #row_1:Int, #col_1:Int) -> ([[Int]])?{
if (step <3) {returnnil}
if (step %2 ==0) {returnnil}
let aRow = [Int](count: step, repeatedValue:0)
var solution = [[Int]](count: step, repeatedValue: aRow)
//要赋值的位置
var row = row_1
var col = col_1
var iPut =1 //放这个数
solution[row][col] = iPut++
var time = step * step -1
do{
//下一个赋值的位置
var nextcol = col +1
var nextrow = row +2
nextcol =correction(nextcol,step)
nextrow =correction(nextrow,step)
if solution[nextrow][nextcol] !=0{
nextrow = row -1
nextrow =correction(nextrow,step)
nextcol = col
if solution[nextrow][col] !=0{
return solution
}
}
row = nextrow
col = nextcol
solution[row][col] = iPut++
}while(time-- >0)
return nil
}
//测试过程
func testJJHorse2(){
func testAStep(step:Int, row_1: Int, col_1:Int){
let s =JJHorse2(step: step, row_1: row_1, col_1: col_1)
iflet s1 = s{
printMagic(s1)
let k =isMagic(s1)
iflet k1 = k{
println("这个不是幻方 k=\(k1)")
}
}else{
println("s is not a magic square step =\(step)")
}
}
println("3的倍数不行")
testAStep(3,0,0)
testAStep(5,0,0)
testAStep(5,0,1)
testAStep(5,0,2)
testAStep(5,0,3)
testAStep(5,0,4)
testAStep(5,1,1)
testAStep(5,1,2)
testAStep(5,1,3)
testAStep(5,2,2)
testAStep(5,3,3)
testAStep(7,0,0)
println("3的倍数不行")
testAStep(9,0,0)
}
//testJJHorse2()//打开即可打印
/*
3的倍数不行
[1, 7, 4]
[9, 6, 3]
[5, 2, 8]
这个不是幻方 k=[1, 0]
[1, 14, 22, 10, 18]
[25, 8, 16, 4, 12]
[19, 2, 15, 23, 6]
[13, 21, 9, 17, 5]
[7, 20, 3, 11, 24]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[18, 1, 14, 22, 10]
[12, 25, 8, 16, 4]
[6, 19, 2, 15, 23]
[5, 13, 21, 9, 17]
[24, 7, 20, 3, 11]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[10, 18, 1, 14, 22]
[4, 12, 25, 8, 16]
[23, 6, 19, 2, 15]
[17, 5, 13, 21, 9]
[11, 24, 7, 20, 3]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[22, 10, 18, 1, 14]
[16, 4, 12, 25, 8]
[15, 23, 6, 19, 2]
[9, 17, 5, 13, 21]
[3, 11, 24, 7, 20]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[14, 22, 10, 18, 1]
[8, 16, 4, 12, 25]
[2, 15, 23, 6, 19]
[21, 9, 17, 5, 13]
[20, 3, 11, 24, 7]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[24, 7, 20, 3, 11]
[18, 1, 14, 22, 10]
[12, 25, 8, 16, 4]
[6, 19, 2, 15, 23]
[5, 13, 21, 9, 17]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[11, 24, 7, 20, 3]
[10, 18, 1, 14, 22]
[4, 12, 25, 8, 16]
[23, 6, 19, 2, 15]
[17, 5, 13, 21, 9]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[3, 11, 24, 7, 20]
[22, 10, 18, 1, 14]
[16, 4, 12, 25, 8]
[15, 23, 6, 19, 2]
[9, 17, 5, 13, 21]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[17, 5, 13, 21, 9]
[11, 24, 7, 20, 3]
[10, 18, 1, 14, 22]
[4, 12, 25, 8, 16]
[23, 6, 19, 2, 15]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[15, 23, 6, 19, 2]
[9, 17, 5, 13, 21]
[3, 11, 24, 7, 20]
[22, 10, 18, 1, 14]
[16, 4, 12, 25, 8]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
[1, 18, 35, 45, 13, 23, 40]
[49, 10, 27, 37, 5, 15, 32]
[41, 2, 19, 29, 46, 14, 24]
[33, 43, 11, 28, 38, 6, 16]
[25, 42, 3, 20, 30, 47, 8]
[17, 34, 44, 12, 22, 39, 7]
[9, 26, 36, 4, 21, 31, 48]
经检查,行的和都是相等的
经检查,列的和都是相等的
经检查,左对角线的和都是相等的
经检查,右对角线的和都是相等的
3的倍数不行
[1, 22, 43, 55, 76, 16, 28, 49, 70]
[81, 12, 33, 54, 66, 6, 27, 39, 60]
[71, 2, 23, 44, 56, 77, 17, 29, 50]
[61, 73, 13, 34, 46, 67, 7, 19, 40]
[51, 72, 3, 24, 45, 57, 78, 18, 30]
[41, 62, 74, 14, 35, 47, 68, 8, 20]
[31, 52, 64, 4, 25, 37, 58, 79, 10]
[21, 42, 63, 75, 15, 36, 48, 69, 9]
[11, 32, 53, 65, 5, 26, 38, 59, 80]
这个不是幻方 k=[1, 0]
*/
- 幻方解法之horse法生成奇阶幻方
- 幻方解法之Merzirac法生成奇阶幻方
- 幻方解法之Louberel法生成奇阶幻方
- 幻方解法之错位补角法生成奇阶幻方
- 幻方解法之Spring法生成双偶幻方
- 幻方解法之Strachey法生成单偶幻方
- 幻方解法之Strachey法生成双偶幻方
- 幻方解法之总结篇
- 幻方解法之swift语言程序实现开篇
- (ZT)幻方常规解法汇总
- c++幻方的解法与判断
- 幻方的生成
- 幻方的生成
- 幻立方解法之7阶幻立方的生成方法
- Bad horse(图的广度遍历解法)
- 幻立方解法之开篇
- poj2253 frog之最小生成树prim解法
- POJ2349Arctic Network之最小生成树kruskal解法
- 最长上升子序列nlogn算法
- 【python】简单爬虫制作(汽车之家&易车网报价爬虫)
- tomcat6配置https (双向认证/单向认证)
- 01背包问题几种算法实现
- Linux下信号种类以及特殊信号的含义
- 幻方解法之horse法生成奇阶幻方
- 内表数据保存到本地EXCEL
- PCL学习笔记(1) win8 64bit系统 + VS208——搭建PCL开发环境
- Android应用获取root权限,修改系统文件
- IOS 使用Xcode5制作静态库详解
- java日期格式化之特殊字符
- URL中文乱码服务器端(tomcat)解决方法
- Rayeager PX2开发板Ubuntu系统V1.0 beta版本
- SDJZU_新生_字符串匹配(KMP)_A - Number Sequence