/*
程序思想参考百度百科上"幻方法则" 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
*/
//第一篇先只记录一些辅助方法,后面的篇章才是具体解法,他们基本上都会用到这些方法
/*
检查是不是幻方,如果不是返回行或列的角标
[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
}