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