資源限制
時間限制:1.0s 記憶體限制:512.0mb
問題描述
給定乙個n*n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行、同一列或同一條對角線上,任意的兩個白皇后都不在同一行、同一列或同一條對角線上。問總共有多少種放法?n小於等於8。
輸入格式
輸入的第一行為乙個整數n,表示棋盤的大小。
接下來n行,每行n個0或1的整數,如果乙個整數為1,表示對應的位置可以放皇后,如果乙個整數為0,表示對應的位置不可以放皇后。
輸出格式
輸出乙個整數,表示總共有多少種放法。
樣例輸入4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
樣例輸入4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
思路總體上的思路是學習八皇后思想,首先完成白皇后的八皇后,再白皇后的基礎上完成黑皇后的八皇后情形
對於八皇后棋盤來說:
主對角線共15條,主對角線上的位置滿足y-x相等
副對角線共15條,副對角線上的位置滿足y+x相等
劉汝佳演算法入門經典 p193頁 ,書上還有利用位置關係判斷衝突的方法
0代表未被佔據,1代表佔據
v[0][i] 代表第i列是否被佔據
v[1][i-cur+n]cur代表行號 代表第i-cur+n條主對角線 實際上是和i對應在一起的左上角
v[2][i+cur]代表第i+cur條副對角線,實際上是和i對應的右上角
實際上v的大小滿足v[3][2n-1],2n-1代表的是對角線數
方法就是先獲得白皇后滿足n皇后情況後的棋盤,
然後在此基礎上再去獲得黑皇后滿足條件的全排列
對於初次接觸n皇后的小白來說,需要注意的是:
掌握遞迴列舉/回溯法
n皇后的棋盤列印,可以寫在n==cur後面,因為此時的c[cur]的n個位置都有著對應的皇后
對於本題來說,需要注意的是:
**
#include
#include
#define n 100
using
namespace std;
int n;
int ans=0;
int c[n]
[n];
//c代表輸入棋盤,我覺得用到的地方只有那個不能放棋子的0位置
int wvisit[3]
[n];
// 判斷衝突陣列
int bvisit[3]
[n];
int white[n]
;//whihe[cur]=j 代表的是第cur行的皇后在j的位置
int black[n]
;void
white_dfs
(int);
void
black_dfs
(int);
/*主對角線共15條,主對角線上的位置滿足y-x相等
副對角線共15條,副對角線上的位置滿足y+x相等
劉汝佳演算法入門經典 p193頁 ,書上還有利用位置關係判斷衝突的方法
0代表未被佔據,1代表佔據
v[0][i] 代表第i列是否被佔據
v[1][i-cur+n]cur代表行號 代表第i-cur+n條主對角線 實際上是和i對應在一起的左上角
v[2][i+cur]代表第i+cur條副對角線,實際上是和i對應的右上角
方法就是先獲得白皇后滿足n皇后情況後的棋盤,
然後在此基礎上再去獲得黑皇后滿足條件的全排列
*/void
white_dfs
(int cur)
else
for(
int i=
0;i}void
black_dfs
(int cur)
else
for(
int i=
0;i}int
main()
八皇后
思路
回溯法,每一行有n列可供選擇,當前的行號cur在0-7列的時候,同時也要和前cur行進行比較,比較涉及列、對角衝突,一旦衝突就放棄了,截至遞迴終止的話就進行下一行,如果能到第n行,表明皇后在第cur行在第i列存在可行方案
#include
#include
#define n 20
int n;
int cnt=0;
int lst[n]
;using
namespace std;
void
search
(int cur)
}//如果第cur行的第i列合法,即與前cur行都沒有衝突,flag==1,繼續尋找下一行,等到遞迴迴圈結束,在次基礎上,到下一列進行遞迴
if(flag)
search
(cur+1)
;}}}
intmain()
return0;
}
語法
函式的宣告需要在開始宣告才能確保函式之間的相互呼叫,宣告函式的時候必須宣告引數型別
藍橋杯基礎練習 2n皇后問題
問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於8。輸入格式 輸入的第一行為乙個整數n,表示棋盤的大小。接...
藍橋杯 基礎練習 2n皇后問題
問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於8。輸入格式 輸入的第一行為乙個整數n,表示棋盤的大小。接...
藍橋杯基礎練習2n皇后問題C語言
問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於8。輸入格式 輸入的第一行為乙個整數n,表示棋盤的大小。接...