2021 3 5 基礎練習 2n皇后問題

2021-10-21 04:15:16 字數 2646 閱讀 2599

【練習時間】2020/3/6

【題目名稱】基礎練習 2n皇后問題

資源限制

時間限制:1.0s 記憶體限制:512.0mb

問題描述

給定乙個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【解題思路】

通過對網上的解題思路的研究,我們選擇下面這一種便於理解的解法,參考部落格:[藍橋杯][基礎練習vip]2n皇后問題-題解(c++**) //上面大佬的翻譯版

大致思路如下:

採用二維陣列模擬棋盤,多個一維陣列用於記錄列和對角線棋子位置情況。

我們採用窮舉的方法,逐行分別對白棋和黑棋的位置進行模擬放置,同時記錄該列和對角線的情況(注意:因為我們採用的是逐行的思路,所以不用考慮相同顏色的棋子在同一行的情況),滿足條件則安排下一行的位置;將上述的演算法封裝成函式,形參為開始遍歷的行數,形參+1再次呼叫(遞迴的方法)

詳細實現過程:

初始化全域性變數:

int n,ans,pan[8]

[8];

//棋盤初始化,結果ans初始化為0

int col_w[18]

;//一列中白棋的位置

int col_b[18]

;//一列中黑棋的位置

int val_w_rd[16]

;//從左上到右下對角線上白棋的位置

int val_b_rd[16]

;//從左上到右下對角線上黑棋的位置

int val_w_ld[16]

;//從右上到左下對角線白棋的位置

int val_b_ld[16]

;//從右上到左下對角線黑棋的位置

設計函式:

void

queen

(int row)

//逐行放置黑白棋,從第零行開始擺放

for(

int i=

0;i!=n;

++i)

//優先擺放白棋

}//白棋覆盤

pan[row]

[i]=

1;col_w[i]=0

;val_w_ld[row+i]=0

;val_w_rd[row-i+n-1]

=0;}

}}

注意:對於如何採用一維陣列記錄對角線的情況我們是這樣做的:

通過上圖舉例我們發現:

左對角線所有元素縱橫座標和都等於n。

右對角線所有元素的橫座標-縱座標+元素個數都相同。

【源**】

#include

#include

#include

using

namespace std;

int n,ans,pan[8]

[8];

//棋盤初始化,結果ans初始化為0

int col_w[18]

;//一列中白棋的位置

int col_b[18]

;//一列中黑棋的位置

int val_w_rd[16]

;//從左上到右下對角線上白棋的位置

int val_b_rd[16]

;//從左上到右下對角線上黑棋的位置

int val_w_ld[16]

;//從右上到左下對角線白棋的位置

int val_b_ld[16]

;//從右上到左下對角線黑棋的位置

void

queen

(int row)

;int

main()

void

queen

(int row)

//逐行放置黑白棋,從第零行開始擺放

for(

int i=

0;i!=n;

++i)

//優先擺放白棋

}//白棋覆盤

pan[row]

[i]=

1;col_w[i]=0

;val_w_ld[row+i]=0

;val_w_rd[row-i+n-1]

=0;}

}}

基礎練習 2n皇后問題

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

基礎練習 2n皇后問題 dfs

問題描述 給定乙個n n的棋盤,棋盤中有一些位置不能放皇后。現在要向棋盤中放入n個黑皇后和n個白皇后,使任意的兩個黑皇后都不在同一行 同一列或同一條對角線上,任意的兩個白皇后都不在同一行 同一列或同一條對角線上。問總共有多少種放法?n小於等於8。輸入格式 輸入的第一行為乙個整數n,表示棋盤的大小。接...

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

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