幻方解法之swift语言程序实现开篇

/*

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

*/


//第一篇先只记录一些辅助方法,后面的篇章才是具体解法,他们基本上都会用到这些方法


/*

检查是不是幻方,如果不是返回行或列的角标

[n,0] 表示第n行与第一行的和不等

[0,n] 表示第n列与第一行的和不等

[1,1] 表示左对角线与第一行的和不等

[1,-1]表示右对角线与第一行的和不等

*/

func isMagic(s:[[Int]])->[Int]?{

   var step = s.count

    

    //计算某一行的和

   func rowSum(row: Int) ->Int{

       var sum = 0

       for var col =0; col < step; ++col{

            sum = sum + s[row][col]

        }

       return sum

    }

    

    //计算某一列的和

   func colSum(col: Int) ->Int{

       var sum = 0

       for var row =0; row < step; ++row{

            sum = sum + s[row][col]

        }

       return sum

    }

    

    //计算左对角线的和

   func leftDiaSum() -> Int{

       var sum = 0

       for var row =0; row < step; ++row{

            sum = sum + s[row][row]

        }

       return sum

    }

    

    //计算右对角线的和

   func rightDiaSum() -> Int{

       var sum = 0

       for var row =0; row < step; ++row{

            sum = sum + s[row][step - row -1]

        }

       return sum

    }


    //第一行的和

   let sum0 = rowSum(0)

    

    //行的和是否相等

   for var row =1; row < step; ++row{

       if sum0 != rowSum(row){

           return [row,0]

        }

    }

    println("经检查,行的和都是相等的")

    

    //列的和是否相等

   for var col =0; col < step; ++col{

       if sum0 != colSum(col){

           return [0,col]

        }

    }

    println("经检查,列的和都是相等的")

    

    //左对角线的和是否相等

   if sum0 != leftDiaSum(){

       return [1,1]

    }

    println("经检查,左对角线的和都是相等的")

    

    //右对角线的和是否相等

   if sum0 != rightDiaSum(){

       return [1,-1]

    }

    println("经检查,右对角线的和都是相等的")

        

    return nil

}



//打印幻方数组

func printMagic(s:[[Int]]){

   let step = s.count

   for var i =0; i < step; ++i{

       println("\(s[i])")

    }

}


//正数返回1,负数返回-1

func signed(aint:Int)->Int{

   if aint > 0{

       return 1

    }elseif aint < 0{

       return -1

    }else{

       return 0

    }

}



//修正角标索引

func correction(k:Int, step: Int) ->Int{

   return (k % step + step) % step

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值