幻方解法之Louberel法生成奇阶幻方

本文介绍了使用Louberel法生成奇阶幻方的算法,详细阐述了算法思想,并提供了Swift代码实现。通过该算法,可以生成不同阶数的幻方,验证结果显示所有行、列及对角线的数字和均相等。
摘要由CSDN通过智能技术生成

/*

程序思想参考百度百科上"幻方法则" 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

*/


/*

在居中的方格向上一格内放1,依次向右上方填入234…,如果右上方已有数字,则向上移两格继续填写。如下图用Louberel法生成的5阶幻方:

23 6 19 2 15

10 18 1 14 22

17 5 13 21 9

4 12 25 8 16

11 24 7 20 3

*/

func JJLouberel(#step: Int) -> ([[Int]])?{

    if (step < 3) { return nil}

    if (step % 2 == 0) { return nil}

    

    let aRow = [Int](count: step, repeatedValue: 0)

    var solution = [[Int]](count: step, repeatedValue: aRow)

    

    //要赋值的位置,初始化为居中的方格向上一格

    var row = step/2 - 1  //中间行的上一行

    var col = step/2  //中间列

    var iPut = 1  //放这个数

    //居中的方格向上一格放1

    solution[row][col] = iPut++

    var time = step * step - 1

    do{

        //下一个赋值的位置

        var nextcol = col + 1

        var nextrow = row - 1

        

        nextcol = correction(nextcol,step)

        nextrow = correction(nextrow,step)

        

        if solution[nextrow][nextcol] != 0{

            nextrow = row - 2

            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 testJJLouberel(){

    func testAStep(step: Int){

        let s = JJLouberel(step: step)

        if let s1 = s{

            printMagic(s1)

            let k = isMagic(s1)

            if let k1 = k{

                println("这个不是幻方 k=\(k1)")

            }


        }else{

            println("s is not a magic square step = \(step)")

        }

    }

    

    testAStep(3)

    testAStep(5)

    testAStep(7)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值