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

来源:互联网 发布:ubuntu 14.04 64位 编辑:程序博客网 时间:2024/04/30 02:27

/*

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

       forvar col =0; col < step; ++col{

            sum = sum + s[row][col]

        }

       return sum

    }

    

    //计算某一列的和

   func colSum(col:Int) ->Int{

       var sum =0

       forvar row =0; row < step; ++row{

            sum = sum + s[row][col]

        }

       return sum

    }

    

    //计算左对角线的和

   func leftDiaSum() ->Int{

       var sum =0

       forvar row =0; row < step; ++row{

            sum = sum + s[row][row]

        }

       return sum

    }

    

    //计算右对角线的和

   func rightDiaSum() ->Int{

       var sum =0

       forvar row =0; row < step; ++row{

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

        }

       return sum

    }


    //第一行的和

   let sum0 =rowSum(0)

    

    //行的和是否相等

   forvar row =1; row < step; ++row{

       if sum0 !=rowSum(row){

           return [row,0]

        }

    }

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

    

    //列的和是否相等

   forvar 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

   forvar i =0; i < step; ++i{

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

    }

}


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

func signed(aint:Int)->Int{

   if aint >0{

       return1

    }elseif aint <0{

       return -1

    }else{

       return0

    }

}



//修正角标索引

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

   return (k % step + step) % step

}

0 0
原创粉丝点击