N-Queens Problem 目標是在一個大小為N×N的棋盤上放置N個皇后,使得這些皇后彼此不攻擊。
在這個問題中,皇后可以攻擊位於同一行、同一列或同一對角線上的其他皇后。
N-Queens問題的目標是找到一種方法,將N個皇后放置在棋盤上,使得它們不互相攻擊。
以下是解決N-Queens問題的一種方法:
需要注意的是,N-Queens問題可能有多個解決方案,也可能不存在解決方案,具體取決於N的值。
對於一些特定的N,可以使用遞歸或回溯算法來解決這個問題。
// N Queen Problem in Kotlin
class NQueen {
private val N = 8 // board size
private val board = Array(N) { IntArray(N) }
private fun printSolution(board: Array<IntArray>) {
for (i in 0 until N) {
for (j in 0 until N)
print(" " + board[i][j]
+ " ")
println()
}
}
private fun isSafe(board: Array<IntArray>, row: Int, col: Int): Boolean {
var i: Int
var j: Int
/* Check this row on left side */
i = 0
while (i < col) {
if (board[row][i] == 1)
return false
i++
}
/* Check upper diagonal on left side */
i = row
j = col
while (i >= 0 && j >= 0) {
if (board[i][j] == 1)
return false
i--
j--
}
/* Check lower diagonal on left side */
i = row
j = col
while (j >= 0 && i < N) {
if (board[i][j] == 1)
return false
i++
j--
}
return true
}
private fun solveNQUtil(board: Array<IntArray>, col: Int): Boolean {
if (col >= N)
return true
for (i in 0 until N) {
if (isSafe(board, i, col)) {
board[i][col] = 1
if (solveNQUtil(board, col + 1))
return true
board[i][col] = 0 // BACKTRACK
}
}
return false
}
fun solveNQ() {
if (!solveNQUtil(board, 0)) {
println("Solution does not exist")
return
}
printSolution(board)
}
companion object {
@JvmStatic
fun main(args: Array<String>) {
val Queen = NQueen()
Queen.solveNQ()
}
}
}
// main function
fun main(args: Array<String>) {
val Queen = NQueen()
Queen.solveNQ()
}
所有 Code 可以在 Github 找到 ~
感謝各位讀者,我們明天見!