題目鏈結
問題描述
給定乙個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 #include2using 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小於等於...