給定乙個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資料規模和約定
我們約定,輸入的串的長度不超過15
資源約定:峰值記憶體消耗(含虛擬機器) < 256m, cpu消耗 < 1000ms
先放黑子、再放子
1、在原始輸入棋盤的基礎上,先用乙個vector儲存所有放了n個黑子的合法鍵盤
2、再用另乙個vector儲存在每乙個放了n個黑子的合法鍵盤上放n個白子的合法鍵盤,該vector的大小就是答案
#include
#define n 10
using
namespace std;
vectorint>
>
a(n, vector<
int>
(n))
;//放原始棋盤
vectorint>
>
b(n, vector<
int>
(n,1))
;//中間過渡棋盤
vectorint>
>
> all;
//儲存所有放n個黑子的合法棋盤
vectorint>
>
> ans;
//儲存在all的棋盤中放n個白子的合法棋盤
int n;
//放子後更新棋盤
void
update
(vectorint>
>
&arr,
int i,
int j,
int val)
//恢復棋盤
void
back
(vectorint>
>
&arr, vectorint>
>
&c,int i,
int j)
//放黑子
void
putblack
(int k)
for(
int i=
0; i//放白子
void
putwhite
(vectorint>
>
&arr,
int k)
for(
int i=
0; iintmain()
}//從all中每個棋盤的第0行放白子
putwhite
(all[i],0
);}//列印所有棋盤個數
cout
}
藍橋杯試題 基礎練習 2n皇后問題
資源限制 時間限制 1.0s 記憶體限制 512.0mb 問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於...
藍橋杯基礎練習 2n皇后問題
問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於8。輸入格式 輸入的第一行為乙個整數n,表示棋盤的大小。接...
藍橋杯 基礎練習 2n皇后問題
問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於8。輸入格式 輸入的第一行為乙個整數n,表示棋盤的大小。接...