問題描述
給定乙個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
樣例輸出
2 樣例輸入
4 1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
樣例輸出
0分析:
與n皇后對比,這裡多了一種顏色的皇后
而且地圖格仔有些是不能放置皇后的,因此用乙個map二維陣列存放地圖
在深搜的過程中,每次深搜對某一行的皇后進行放置,放置好了則深搜下一行
因此不需要判斷放置皇后的時候是否與上一次放置在同一行
同時用乙個flag陣列標誌各個列,
因為不能同列,因此假設該行該列放置了皇后,則將其標誌為不可放置
最後的條件是對角,放置該皇后是否會形成對角關係 ,
這裡通過數學的等腰三角形關係,計算兩個腰是否相等,
即要放置元素的該行與之前以放置好的各個行元素進行計算行差,
再計算要放置元素的列位置與之前放置好的各個行中對應的列進行計算列差
判斷行差與列差是否相等。
迴圈比較的次數是n次,將要放置的第n行與之前的第0到n-1行計算行差列差計算
這裡要注意計算的是兩個皇后的不是乙個
#include
#include
#include
#include
#include
#include
using
namespace
std;
intmap[10][10];
int n;
int flaga[10] = ;//儲存某一列是否已放置了皇后,用0和1 ,初值為0表示空
int flagb[10] = ;
int dira[10],dirb[10];//儲存從0到7行皇后的位置,初始化為-1
int count ;
bool judge( int numa,int numb)
for ( int i = 0 ; i < numb ; i++)
return
true;
}bool judge( int num ,int numa,int numb)
return
true;
}void dfs(int num)
//2n皇后的在同一行
for ( int i = 0 ; i < n ; i++)}}
}int main ()
藍橋杯 2n皇后
資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於...
藍橋杯 2n皇后問題
問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於8。輸入格式 輸入的第一行為乙個整數n,表示棋盤的大小。接...
藍橋杯 2n皇后問題
基礎練習 2n皇后問題 出處問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后 和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩 個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於8。輸入格式 輸入的第一行...