返回首页

回溯:N 皇后(约束搜索与剪枝)

一、面试常考点

1. 剪枝思路

列冲突、主对角线冲突、副对角线冲突立即剪枝。

2. 状态表示

用集合记录已占用列和两种对角线。

二、细节介绍

1. 递归层级

按“行”递归,每行放一个皇后。

2. 对角线编码

主对角线 row-col,副对角线 row+col

三、示例代码(计数版)

function totalNQueens(n) {
  let ans = 0
  const cols = new Set()
  const diag1 = new Set()
  const diag2 = new Set()

  function dfs(row) {
    if (row === n) {
      ans++
      return
    }

    for (let col = 0; col < n; col++) {
      const d1 = row - col
      const d2 = row + col
      if (cols.has(col) || diag1.has(d1) || diag2.has(d2)) continue

      cols.add(col)
      diag1.add(d1)
      diag2.add(d2)
      dfs(row + 1)
      cols.delete(col)
      diag1.delete(d1)
      diag2.delete(d2)
    }
  }

  dfs(0)
  return ans
}

四、常用应用场景

1. 约束满足问题

排班、调度、资源冲突分配。

2. 搜索剪枝题

复杂组合空间中的可行解筛选。