藍橋杯 基礎練習 2n皇后問題

2021-10-09 14:28:38 字數 1732 閱讀 3777

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

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

輸出格式:輸出乙個整數,表示總共有多少種放法。

樣例輸入

41 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

樣例輸出2

樣例輸入

41 0 1 1

1 1 1 1

1 1 1 1

1 1 1 1

樣例輸出0

這道題目所說的「2n」皇后,實質上還是n皇后的問題,也就是8皇后的問題。

只不過是在完成乙個n皇后的問題的基礎上,在次放置另外乙個n皇后,與初次放置的原理基本相同,唯一不同之處在於:初次放置n皇后,是建立在所給的棋盤的基礎之上,只要滿足皇后的放置規則,同時,也是該位置允許放置皇后即可。 第2次放置n皇后,只是允許放置的位置了附加條件----第一次放置的黑皇后(假設先放置黑皇后,再放置白皇后)所在的位置,不能放置白皇后。

解決問題時,如果不想麻煩的判斷黑皇后(先)和白皇后(後)判斷時,不同的條件怎麼去用變數控制的話,可以直接暴力的去將 黑皇后 和 白皇后 的放置和判斷函式分開寫即可。

我用到的時 深度優先判斷 與 遞迴 的結合 回溯演算法的思想。具體的**如下:

因為每個問題怎麼處理都寫在了注釋上,所以看起來比較長,但是,很好理解~

//先寫出來乙個n皇后的**,再改寫成2n皇后的問題

//所有陣列的下標從1開始

#include

#include

int n,i;

//表示皇后的個數,和,當前皇后的個數

int matrix[10]

[10]=

;//儲存輸入的棋盤的資訊----如果規模大,把陣列改大點就可以了

int a[10]

=;//用於儲存每行皇后的存放位置:下標表示第幾個皇后,陣列元素的值表示這是放在第幾列

int b[10]

=;//作用同上

int sum=0;

intjudge_white

(int num)

intput_white

(int i)

int j;

for(j=

1;j<=n;j++

)//該層的皇后還沒有試過所有的可能----該迴圈是回溯的地方

return0;

}int

judge_black

(int num)

intsolve_black

(int i)

int j;

for(j=

1;j<=n;j++

)//該層的皇后還沒有試過所有的可能----該迴圈是回溯的地方

return0;

}int

main()

其實,我最初是不會皇后的,但是看到這個題之後,就還是不得不又拿起了回溯演算法。哎,出來混,都是要還的,只是,今天還還是明天還的問題而已。近期已經深刻的領悟到了這個問題,所以,堅決不給以後的自己找事!!

如果想看8皇后問題,或者說是回溯演算法的總結,我正好最近在整理,可以來看我明天的博文。。

藍橋杯基礎練習 2n皇后問題

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

藍橋杯 VIP 基礎練習 2n皇后問題

基礎練習 2n皇后問題 時間限制 1.0s 記憶體限制 512.0mb 問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放...

藍橋杯 VIP 基礎練習 2n皇后問題

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