JakeLin 藍橋杯 棋盤多項式 題解

2021-10-23 04:24:47 字數 2035 閱讀 2739

八皇后問題是在棋盤上放皇后,互相不攻擊,求方案。變換一下棋子,還可以有八車問題,八馬問題,八兵問題,八王問題,注意別念反。在這道題裡,棋子換成車,同時棋盤也得  換,確切說,是進行一些改造。比如現在有一張n*n的棋盤,我們在一些格仔上摳幾個洞,這些洞自然不能放棋子了,會漏下去的。另外,乙個車本來能攻擊和它  的同行同列。現在,你想想,在攻擊的過程中如果踩到乙個洞,便會自取滅亡。故,車的攻擊範圍止於洞。 

此題,給你棋盤的規模n,以及挖洞情況,求放k個車的方案數(k從0到最多可放車數) 

資料規模和約定 

n< =8 

輸入第一行乙個整數n表示棋盤大小 

接下來n行,每行n個用空格隔開的數字0或1,0的形狀表示洞,1表示沒有洞 

輸出若干行,第i行表示放i個車的方案數 

樣例輸入

3

1 0 1

1 1 1

1 0 1

樣例輸出

7

124

題目鏈結(可提交)

正如題目所說,本題是基於回溯法的經典題目:《n皇后問題》提出的,在深入理解這道題目之前,強烈推薦先戳一下之前的文章,增強「n皇后問題」的理解  《n皇后和2n皇后問題的解析》

一、n皇后問題的思路簡述

n皇后問題只能放入n個皇后,並且是每行只有乙個,每列也只有乙個!

當我們確定step時,遍歷這一行的每一列去找尋符合條件的位置。

二、本題與n皇后問題有何不同

題目中:現在,在攻擊的過程中如果踩到乙個洞,便會自取滅亡。故,車的攻擊範圍止於洞。

舉例:某行是 1 0 1

答: 沒錯,我們需要遍歷(i,j)之後的所有點找尋符合條件的位置,同行同列也可哦

問:那麼何為符合條件的位置

答:我們假設這個位置是(x,y)

在同一行上:如若(x,1~y)中有1,並且他們之間沒有0阻擋,那麼它變會被攻擊,不是合法的位置,否則即使安全位置

在同一列上:如若(1~x,y)中有1,並且他們之間沒有0阻擋,那麼它變會被攻擊,不是合法的位置,否則即使安全位置

這裡我們就寫乙個check( ),判斷一下某乙個點(x,y)安全否 :

bool check(int x,int y,int n) 

for(int i=y-1; i>=1; i--)

return true;

}

三、如何實現

和n皇后問題一樣,用dfs演算法實現該過程,解釋變數:

dfs(int x,int y,int t,int n) // 訪問了(x,y);此時t個車;n為棋盤規模

int num[maxn] // num[i]表示i個車的方案數

dfs演算法過程,具體解析寫在**中:

void dfs(int x,int y,int t,int n) }}

}

完整**如下: 

#include#includeusing namespace std;

const int maxn = 10;

int map[maxn][maxn];

int vis[maxn][maxn];

int num[maxn];

bool check(int x,int y,int n)

for(int i=y-1; i>=1; i--)

return true;

}void dfs(int x,int y,int t,int n) }}

}int main()

}dfs(1,1,0,n);

for(int i=1; i<=n*n;i++) {

if(num[i]!=0) cout《若對你有所幫助,萬分榮幸!

藍橋杯 演算法提高 棋盤多項式

演算法提高 棋盤多項式 時間限制 1.0s 記憶體限制 256.0mb 棋盤多項式 問題描述 八皇后問題是在棋盤上放皇后,互相不攻擊,求方案。變換一下棋子,還可以有八車問題,八馬問題,八兵問題,八王問題,注意別念反。在這道題裡,棋子換成車,同時棋盤也得換,確切說,是進行一些改造。比如現在有一張n n...

17 棋盤多項式

17 棋盤多項式 問題描述 八皇后問題是在棋盤上放皇后,互相不攻擊,求方案。變換一下棋子,還可以有八車問題,八馬問題,八兵問題,八王問題,注意別念反。在這道題裡,棋子換成車,同時棋盤也得換,確切說,是進行一些改造。比如現在有一張n n的棋盤,我們在一些格仔上摳幾個洞,這些洞自然不能放棋子了,會漏下去...

演算法提高 棋盤多項式

問題描述 八皇后問題是在棋盤上放皇后,互相不攻擊,求方案。變換一下棋子,還可以有八車問題,八馬問題,八兵問題,八王問題,注意別念反。在這道題裡,棋子換成車,同時棋盤也得換,確切說,是進行一些改造。比如現在有一張n n的棋盤,我們在一些格仔上摳幾個洞,這些洞自然不能放棋子了,會漏下去的。另外,乙個車本...