Hard草稿★★★★★O(n!) 時間 · O(n) 空間
BacktrackingBit Manipulation
Patterns🌿 回溯💡 位元技巧
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

52N Queens IIBacktrackingHardBacktracking

N 皇后問題:在 n x n 的棋盤上放置 n 個皇后,使得任意兩個皇后不能互相攻擊(不同行、不同列、不同對角線)。回傳解的數量。

Example:

Input: n = 4 Output: 2

Intuition

TIP

核心思路:與 51. N-Queens 相同的回溯,但只計數不需要記錄棋盤。

Approaches

1. Backtracking + HashSet — O(n!) / O(n)
  • Idea: 逐行放置皇后,用 HashSet 記錄被佔用的列和對角線
  • Time: O(n!) - 每行的可選列逐步減少
  • Space: O(n)
class Solution {
    fun totalNQueens(n: Int): Int {
        val cols = mutableSetOf<Int>()
        val diag1 = mutableSetOf<Int>()  // row - col
        val diag2 = mutableSetOf<Int>()  // row + col
        var count = 0

        fun backtrack(row: Int) {
            if (row == n) {
                count++
                return
            }

            for (col in 0 until n) {
                if (col in cols || (row - col) in diag1 || (row + col) in diag2) {
                    continue
                }

                cols.add(col)
                diag1.add(row - col)
                diag2.add(row + col)

                backtrack(row + 1)

                cols.remove(col)
                diag1.remove(row - col)
                diag2.remove(row + col)
            }
        }

        backtrack(0)
        return count
    }
}
⭐ 2. Backtracking + Bitmask — O(n!) / O(n)
  • Idea: 用三個整數的位元表示佔用狀態,位元運算比 HashSet 更快
  • Time: O(n!)
  • Space: O(n) - 遞迴深度
class Solution {
    fun totalNQueens(n: Int): Int {
        var count = 0

        fun backtrack(row: Int, cols: Int, diag1: Int, diag2: Int) {
            if (row == n) {
                count++
                return
            }

            // 可用位置 = 所有位置 - 被攻擊的位置
            var available = ((1 shl n) - 1) and (cols or diag1 or diag2).inv()

            while (available != 0) {
                // 取最低位的 1(lowbit trick)
                val pos = available and (-available)
                available = available xor pos

                backtrack(
                    row + 1,
                    cols or pos,
                    (diag1 or pos) shl 1,
                    (diag2 or pos) shr 1
                )
            }
        }

        backtrack(0, 0, 0, 0)
        return count
    }
}

🔑 Takeaways

Ladders 看全部 →

N 皇后

棋盤回溯:輸出解到只計數。

  1. 1#51N-QueensHard輸出所有擺法(回溯 + 對角線剪枝)
  2. 2