回溯算法:八皇后问题

2020-10-27  本文已影响0人  云飞扬1
class EightQueenQuestion {

    private val result = Array(8) { -1 }

    private var count = 0

    fun calcEightQueens(row: Int) {
        if (row == 8) {
            printQueenMatrix()
            return
        }
        for (i in 0 until 8) {
            if (isOk(row, i)) {
                result[row] = i
                calcEightQueens(row + 1)
            }
        }
    }

    private fun isOk(row: Int, column: Int): Boolean {
        var leftUp = column - 1
        var rightUp = column + 1;
        for (i in row - 1 downTo 0) {
            if (result[i] == column) {
                return false
            }
            if (leftUp >= 0 && result[i] == leftUp) {
                return false
            }
            if (rightUp < 8 && result[i] == rightUp) {
                return false
            }
            leftUp--
            rightUp++
        }
        return true
    }

    /**
     * 但因当前八皇后矩阵
     */
    private fun printQueenMatrix() {
        println("=======打印八皇后 ${++count} =======")
        for (i in 0 until 8) {
            for (j in 0 until 8) {
                if (result[i] == j) {
                    print("Q ")
                } else {
                    print("* ")
                }
            }
            println()
        }
    }

}

调用执行:

EightQueenQuestion().calcEightQueens(0)
上一篇 下一篇

猜你喜欢

热点阅读