2N皇后問題 演算法 C

2021-08-18 08:09:59 字數 1330 閱讀 2860

2n皇后問題(wustoj-1291)

description

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

對於遞迴與回溯,原理跟n皇后問題差不多,其難點就在於如何對該棋盤進行既不重複也不遺漏的遍歷,還有就是遞迴的結束條件,這兩點在前面的n皇后問題中已經講解得很透徹。

現在,我們假設你已經對n皇后問題的解法有較為透徹的理解。那麼我們就這樣擺放皇后:我們先擺放黑皇后(或者先擺放白皇后也可以),我們先定義乙個棋盤map_q,從標準輸入流中定義,然後我們用兩個一維陣列posb[i],posw[i]分別表示棋盤的放置黑/白皇后的位置,如posb[i]=j,則表示棋盤上的第i列的黑皇后被放在第j行上。然後,我們同樣根據n皇后的演算法把所有的黑皇后放置完成,此時,我們在這樣的基礎上再放置白皇后,原理也跟n皇后的放置一樣,只是多了一些判斷能否放置的前提條件。當白皇后也完全放置時,結束一次大的遞迴迴圈,然後返回到黑皇后的dfs迴圈裡面,在進行又一次大迴圈。

以下為c++實現的源**:

#include#includeusing namespace std;

const int maxn = 10;

int n;

int map_q[maxn][maxn];

int posb[maxn]=;

int posw[maxn]=;

int ans;

bool checkw( int cur) //檢查函式

bool checkb( int cur) //檢查函式

void dfs_white( int cur)

for( int i = 1; i <= n; i++)

}

void dfs_black( int cur)

for( int i = 1; i <= n; i++)

}

int main()

{

cin>>n;

for( int i = 1; i <= n; i++) //定義棋盤

for( int j = 1; j <= n; j++)

cin>>map_q[i][j];

ans = 0;

dfs_black(1); //先把黑皇后放在第一列

cout《如果推廣到k-n皇后問題,該如何求解,可以嘗試以下,當k達到什麼值時,在棋盤都為1的最優情況下仍然無解。

2n皇后問題 C

首先讓我們先來看一下八皇后問題 題目描述 乙個如下的 6 6 的跳棋棋盤,有六個棋子被放置在棋盤上,使得每行 每列有且只有乙個,每條對角線 包括兩條主對角線的所有平行線 上至多有乙個棋子。上面的布局可以用序列2 4 6 1 3 5來描述,第 i 個數字表示在第 i 行的相應位置有乙個棋子,如下 行號...

2n皇后問題

問題描述 在n n的矩陣中放入n個白皇后和n個黑皇后,該矩陣由元素 和 組成,代表該位置不能放皇后,代表可以放皇后,n個的皇后兩兩不能在同一行和同一列以及同一對 角線上,n個黑皇后兩兩不能在同一行和同一列以及同一對角線上。求最多有幾種放法?解法 這個問題跟 皇的問題類似,只不過多了另外一種顏色的皇后...

2n皇后問題

問題描述 給定乙個 n n 的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入 n 個黑皇后和 n 個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不 在同一行 同一列或同一條對角線上。問總共有多少種放法?n 小於等於 8。輸入格式 輸入的第一行為乙個整數 n...