試題 基礎練習 2n皇后問題

2022-06-27 13:00:13 字數 1734 閱讀 9869

題目鏈結

問題描述

給定乙個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演算法:搜尋

思考:每行都要放置黑皇后和白皇后,其實這就是n皇后問題(n*n的棋盤下放置n個皇后,它們之間不同行不同列不同對角線),在n行放置好白皇后的基礎上放置黑皇后。

注釋:dfs(i,s)--i表示目前放置的行數,s表示皇后的顏色(設s=2,表示當前為白皇后,s=3,表示當前為黑皇后)

思路:開始先放置白皇后,起始為:dfs(0,2)

當dfs(i,n)中的i=n時,表示前n行

已放置,判斷當前皇后顏色狀態:

若s=2,表示n個白皇后全部放置完畢,開始放置黑皇后,程式執行dfs(0,3);

若s=3,表示n個黑皇后全部放置完畢,又因為白皇后在黑皇后放置之前已放置完畢,所以可知n個黑皇后和n個白皇后都放置完畢,所以sum++;

**:

1 #include2

using namespace std;

3int mp[10][10];

4int

sum,n;5//

檢測是否符合放置皇后的條件

6int check(int x,int y,int

s)10

for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--)

13for(int i=x-1,j=y+1;i>=0&&j//

測試右對角線是否放過同種顏色的皇后

14if(mp[i][j]==s) return 0;15}

16return 1;17}

18//

每層都要放置黑皇后和白皇后

19void dfs(int x,int

s)25

for(int j=0;j)

32return;33

} 34

35int

main()41}

42 sum=0;

43//

設放置白皇后狀態s=2; 放置黑皇后s=3

44 dfs(0,2);//

先在n行棋盤放置完白皇后

45 cout46 }

注意點(寫過的錯誤):

1.判斷左對角線是否存在同顏色皇后時:for(int i=0,j=0;i,j(0,0)到(n-1,n-1)的這條線,所以check語句錯誤,正確的是for(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--)

2.同理,判斷右對角線是否存在同顏色皇后時,也是類似錯誤

3.不要忘記dfs裡面的return 語句,停止執行下面的語句。

試題 基礎練習 2n皇后問題

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

基礎練習 2n皇后問題

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

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

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