1 条题解

  • 1
    @ 2026-9-4 16:37:38
    #include <cstdlib> // abs
    using namespace std;
    
    const int MAXN = 10;
    
    int n;
    int board[MAXN][MAXN];
    int blackQueens[MAXN]; // blackQueens[row] = col,-1表示未放置
    int countAns;
    
    // 检查在 (row, col) 放置黑皇后是否合法
    bool isValidBlack(int row, int col) {
        if (board[row][col] == 0) return false;
        for (int r = 0; r < row; r++) {
            int c = blackQueens[r];
            if (c == col) return false;                      // 同列
            if (abs(r - row) == abs(c - col)) return false;  // 同对角线
        }
        return true;
    }
    
    // 检查在 (row, col) 放置白皇后是否合法
    bool isValidWhite(int row, int col, int whiteQueens[]) {
        if (board[row][col] == 0) return false;
        if (blackQueens[row] == col) return false;           // 和黑皇后同格
        for (int r = 0; r < row; r++) {
            int c = whiteQueens[r];
            if (c == col) return false;                      // 同列
            if (abs(r - row) == abs(c - col)) return false;  // 同对角线
        }
        return true;
    }
    
    // 回溯放置白皇后
    void backtrackWhite(int row, int whiteQueens[]) {
        if (row == n) {
            countAns++;
            return;
        }
        for (int col = 0; col < n; col++) {
            if (isValidWhite(row, col, whiteQueens)) {
                whiteQueens[row] = col;
                backtrackWhite(row + 1, whiteQueens);
                whiteQueens[row] = -1;
            }
        }
    }
    
    // 回溯放置黑皇后
    void backtrackBlack(int row) {
        if (row == n) {
            int whiteQueens[MAXN];
            for (int i = 0; i < n; i++) whiteQueens[i] = -1;
            backtrackWhite(0, whiteQueens);
            return;
        }
        for (int col = 0; col < n; col++) {
            if (isValidBlack(row, col)) {
                blackQueens[row] = col;
                backtrackBlack(row + 1);
                blackQueens[row] = -1;
            }
        }
    }
    
    int main() {
        cin >> n;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                cin >> board[i][j];
            }
            blackQueens[i] = -1;
        }
        countAns = 0;
        backtrackBlack(0);
        cout << countAns << endl;
        return 0;
    }
    
    
    

    信息

    ID
    1305
    时间
    1000ms
    内存
    128MiB
    难度
    9
    标签
    递交数
    10
    已通过
    4
    上传者