首页 > 编程学习 > 幻立方解法之开篇

/*

最强大脑上陈大记完成的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

}


本文链接:https://www.ngui.cc/zz/2336544.html
Copyright © 2010-2022 ngui.cc 版权所有 |关于我们| 联系方式| 豫B2-20100000