問題描述:給定乙個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,表示棋盤的大小。接...