/*
最强大脑上陈大记完成的7阶幻立方让我震撼
这让原来连9宫格都完成不了的我也开始探索起幻方来
这不前面几篇写的都是关于幻方的解法。
在幻方的解法中我发现这些数字的排列都是有一定的生成方法的
幻立方肯定也有吧
什么样的生成方法可以达到什么样的效果呢
要想知道什么效果,总是需要检验的
人为校验结果总是很累且容易出错
所以我们先写写检验方法吧
后面再研究生成方法
哦,对了,不要问我这代码是什么语言写的
这个是苹果公司最新推出的swift语言
代码环境xcode6.1 command Line Tool
*/
/*
检验一个三维数组是不是幻方
先检查各行,各列,各纵深的和,然后检查各面对角线,最后检查立方体的对角线
如果有某条线的和不等,则返回那条线的首尾点坐标
左上角为原点
*/
func isMagicCube(s:[[[Int]]],log:Bool)->(begin:(row:Int, col: Int, deep: Int),end:(row:Int, col: Int, deep: Int))?{
var step = s.count
//假设第一层的左上角为原点
//计算某条线的线上的数之和,参数必须是线上首尾两个数
func lineSum(#begin:(row:Int,col:Int,deep:Int),#end:(row:Int,col:Int,deep:Int))->Int{
var sum = 0
var row = begin.row
var col = begin.col
var deep = begin.deep
let deltaRow = signed(end.row - begin.row)
let deltaCol = signed(end.col - begin.col)
let deltaDeep = signed(end.deep - begin.deep)
for var i = 0; i < step; ++i{
sum += s[row][col][deep]
if row != end.row{
row = row + deltaRow
}
if col != end.col{
col = col + deltaCol
}
if deep != end.deep{
deep = deep + deltaDeep
}
}
return sum
}
//获取幻和
let sum0 = lineSum(begin: (row: 0, col: 0, deep: 0), end: (row: 0, col: step - 1, deep: 0))
//行的和是否相等
for var row = 0; row < step; ++row{
for var deep = 0; deep < step; ++deep{
if sum0 != lineSum(begin: (row: row, col: 0, deep: deep), end: (row: row, col: step - 1, deep: deep)){
return (begin: (row: row, col: 0, deep: deep), end: (row: row, col: step - 1, deep: deep))
}
}
}
if log{
println("经检查,行的和都是相等的")
}
//列的和是否相等
for var col = 0; col < step; ++col{
for var deep = 0; deep < step; ++deep{
if sum0 != lineSum(begin: (row: 0, col: col, deep: deep), end: (row: step - 1, col: col, deep: deep)){
return (begin: (row: 0, col: col, deep: deep), end: (row: step - 1, col: col, deep: deep))
}
}
}
if log{
println("经检查,列的和都是相等的")
}
//deep的和是否相等
for var row = 1; row < step; ++row{
for var col = 0; col < step; ++col{
if sum0 != lineSum(begin: (row: row, col: col, deep: 0), end: (row: row, col: col, deep: step - 1)){
return (begin: (row: row, col: col, deep: 0), end: (row: row, col: col, deep: step - 1))
}
}
}
if log{
println("经检查,深的和都是相等的")
}
//前视图的各条对角线
for var deep = 0; deep < step; ++deep{
//视图的主对角线
let p1 = (row: 0, col: 0, deep: deep)
let p2 = (row: step - 1, col: step - 1, deep: deep)
if sum0 != lineSum(begin: p1, end: p2){
return (begin:p1, end:p2)
}
//视图的辅对角线
let p3 = (row: 0, col: step - 1, deep: deep)
let p4 = (row: step - 1, col: 0, deep: deep)
if sum0 != lineSum(begin: p3, end: p4){
return (begin:p3, end:p4)
}
}
if log{
println("前视图的各条对角线的和相等")
}
//左视图的各条对角线
for var col = 0; col < step; ++col{
//视图的主对角线(连接原点的对角线)
let p1 = (row: 0, col: col, deep: 0)
let p2 = (row: step - 1, col: col, deep: step - 1)
if sum0 != lineSum(begin: p1, end: p2){
return (begin:p1, end:p2)
}
//视图的辅对角线
let p3 = (row: 0, col: col, deep: step - 1)
let p4 = (row: step - 1, col: col, deep: 0)
if sum0 != lineSum(begin: p3, end: p4){
return (begin:p3, end:p4)
}
}
if log{
println("左视图的各条对角线的和相等")
}
//俯视图的各条对角线
for var row = 0; row < step; ++row{
//视图的主对角线(连接原点的对角线)
let p1 = (row: row, col: 0, deep: 0)
let p2 = (row: row, col: step - 1, deep: step - 1)
if sum0 != lineSum(begin: p1, end: p2){
return (begin:p1, end:p2)
}
//视图的辅对角线
let p3 = (row: row, col: 0, deep: step - 1)
let p4 = (row: row, col: step - 1, deep: 0)
if sum0 != lineSum(begin: p3, end: p4){
return (begin:p3, end:p4)
}
}
if log{
println("俯视图的各条对角线的和相等")
}
//立方体的对角线
//主对角线
if sum0 != lineSum(begin: (row: 0, col: 0, deep: 0), end: (row: step, col: step, deep: step)){
return (begin: (row: 0, col: 0, deep: 0), end: (row: step - 1, col: step - 1, deep: step - 1))
}
if log{
println("经检查,主对角线和是相等的")
}
//辅对角线row
if sum0 != lineSum(begin: (row: step - 1, col: 0, deep: 0), end: (row: 0, col: step - 1, deep: step - 1)){
return (begin: (row: step - 1, col: 0, deep: 0), end: (row: 0, col: step - 1, deep: step - 1))
}
if log{
println("经检查,辅对角线row和是相等的")
}
//辅对角线col
if sum0 != lineSum(begin: (row: 0, col: step - 1, deep: 0), end: (row: step - 1, col: 0, deep: step - 1)){
return (begin: (row: 0, col: step - 1, deep: 0), end: (row: step - 1, col: 0, deep: step - 1))
}
if log{
println("经检查,辅对角线col和是相等的")
}
//辅对角线deep
if sum0 != lineSum(begin: (row: 0, col: 0, deep: step - 1), end: (row: step - 1, col: step - 1, deep: 0)){
return (begin: (row: 0, col: 0, deep: step - 1), end: (row: step - 1, col: step - 1, deep: 0))
}
if log{
println("经检查,辅对角线deep和是相等的")
}
return nil
}
//打印幻立方数组
func printMagicCube(s:[[[Int]]]){
let step = s.count
// println("\(s)")
for var deep = 0; deep < step; ++deep{
println("\n第\(deep)层")
for var row = 0; row < step; ++row{
print("[")
for var col = 0; col < step; ++col{
print("\(s[row][col][deep])")
if col < step - 1{
print(",")
}
}
print("]\n")
}
}
}
//正数返回1,负数返回-1
func signed(aint: Int)->Int{
if aint > 0{
return 1
}else if aint < 0{
return -1
}else{
return 0
}
}
//修正角标索引
func correction(k: Int, step: Int) ->Int{
return (k % step + step) % step
}
//转换幻立方角度
func covertCube(origin: [[[Int]]])->[[[Int]]]{
let step = origin.count
var cubeNew = origin
for var i = 0; i < step; ++i{
for var j = 0; j < step; ++j{
for var k = 0; k < step; ++k{
cubeNew[j][k][i] = origin[i][j][k]
}
}
}
return cubeNew
}