首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode N-Queens II:N 皇後問題計數解法

     編輯:關於C++

題目描述

N 皇後問題變體:只需返回不同解的總數,不輸出具體棋盤佈局。

回溯 + 狀態壓縮優化

逐行放置皇後,維護三個攻擊狀態集合:

  • cols:已佔用列
  • diag1:主對角線 (row - col 恆定)
  • diag2:副對角線 (row + col 恆定)

位掩碼優化(N ≤ 14 適合用 int):

  • columns、diagonals1、diagonals2 為整數掩碼
  • 可用位:(~(columns | diagonals1 | diagonals2)) & ((1<
  • 取最低位 p = available & -available 依嘗試

代碼實現(集合版,通用易懂)


#include 
#include 
using namespace std;

class Solution {
    int count = 0;
    void backtrack(int row, int n, vector& cols, vector& diag1, vector& diag2) {
        if (row == n) { count++; return; }
        for (int col = 0; col < n; col++) {
            int d1 = row - col + n - 1; // 主對角線索引 0~2n-2
            int d2 = row + col;         // 副對角線索引 0~2n-2
            if (!cols[col] && !diag1[d1] && !diag2[d2]) {
                cols[col] = diag1[d1] = diag2[d2] = true;
                backtrack(row + 1, n, cols, diag1, diag2);
                cols[col] = diag1[d1] = diag2[d2] = false;
            }
        }
    }
public:
    int totalNQueens(int n) {
        vector cols(n), diag1(2*n-1), diag2(2*n-1);
        backtrack(0, n, cols, diag1, diag2);
        return count;
    }
};

位掩碼優化版(高性能)


class Solution {
    int count = 0, n;
    void dfs(int row, int cols, int diag1, int diag2) {
        if (row == n) { count++; return; }
        int available = (~(cols | diag1 | diag2)) & ((1<>1);
        }
    }
public:
    int totalNQueens(int n) {
        this->n = n;
        dfs(0, 0, 0, 0);
        return count;
    }
};

複雜度

  • 時間:O(N!) 理論上限,剪枝後實際極快(N=14 約 0.5s)
  • 空間:O(N) 遞歸棧 + 狀態存儲

關鍵點

  • 對角線索引映射:row-col 範圍 [-(n-1), n-1],加 n-1 偏移為 [0, 2n-2]
  • 位掩碼版利用位運算極大加速,LeetCode 硬核優化方案
  • 只需計數不輸出佈局,節省大量字符串構建開銷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved