基礎練習 2n皇后問題

問題描述

給定一個n*n的棋盤,棋盤中有一些位置不能放皇后?,F在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少種放法?n小于等于8。

輸入格式

輸入的第一行為一個整數n,表示棋盤的大小。
  接下來n行,每行n個0或1的整數,如果一個整數為1,表示對應的位置可以放皇后,如果一個整數為0,表示對應的位置不可以放皇后。

輸出格式

輸出一個整數,表示總共有多少種放法。

樣例輸入

4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

樣例輸出

2

樣例輸入

4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1

樣例輸出

0

n皇后問題的變形, 思路是先放白皇后, 將白皇后放完之后, 在往上放置黑皇后

#include <bits/stdc++.h>
using namespace std;
int n;
int m[9][9];
int blackPos[9];
int whitePos[9];
int cnt = 0;

// 判斷當前能否放置皇后 
bool isSafe(int pos[], int row) {
    for(int i = 0; i < row; i++) {
        if(pos[i] == pos[row] || abs(pos[i] - pos[row]) == abs(i - row)) {
            return false;
        }
    }
    return true;
}

// 對黑皇后的放置進行深搜 
void blackDfs(int row) {
    if(row == n) {
        // 如果已經放置完成了n個黑皇后, 那么擺放的方法加1 
        cnt++;
        return ;
    } else {
        for(blackPos[row] = 0; blackPos[row] < n; blackPos[row]++) {
            // 如果當前位置沒有與其他黑皇后發生沖突, 當前可以放置黑皇后而且當前的位置沒有放置白皇后 
            if(isSafe(blackPos, row) && m[row][blackPos[row]] == 1 & blackPos[row] != whitePos[row]) {
                blackDfs(row+1);
            }
        }
    }
}

// 對白皇后的放置進行深搜 
void whiteDfs(int row) {
    if(row == n) {
        // 如果已經放置完成了n個白皇后, 則進行放置黑皇后 
        blackDfs(0);
        return;
    } else {
        for(whitePos[row] = 0; whitePos[row] < n; whitePos[row]++) {
            // 當前位置沒有與其他白皇后沖突且當前位置能放置 
            if(isSafe(whitePos, row) && m[row][whitePos[row]] == 1) {
                whiteDfs(row+1);
            }
        }
    }
}


int main() {
    scanf("%d", &n);
    for(int i = 0; i < n; i++) {
        for(int j = 0; j < n; j++) {
            scanf("%d", &m[i][j]);
        }
    }
    whiteDfs(0);
    //blackDfs(0);
    printf("%d\n", cnt);

    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第1章 第一個C程序第2章 C語言基礎第3章 變量和數據類型第4章 順序結構程序設計第5章 條件結構程序設計第6章...
    小獅子365閱讀 10,723評論 3 71
  • 鋪地毯 題目描述 為了準備一個獨特的頒獎典禮,組織者在會場的一片矩形區域(可看做是平面直角坐標系的第一象限)鋪上一...
    bbqub閱讀 422評論 0 0
  • 生活大爆炸版石頭剪刀布 題目描述 石頭剪刀布是常見的猜拳游戲:石頭勝剪刀,剪刀勝布,布勝石頭。如果兩個人出拳一樣,...
    bbqub閱讀 485評論 0 0
  • 不要有只猴子牽著,就把自己當成齊天大圣。這是我們不該犯,卻常有人在犯的錯誤
    深山老頭閱讀 431評論 0 0
  • 正跟朋友開心聚會吃東西,被類似傳銷組織控制,有兩個人,好像是老師,被控制的有很多人,我想盡辦法反復逃走,又自己回去...
    我是一只沒有腳的鳥閱讀 238評論 0 0