POJ2663 完美覆蓋

2021-07-09 20:15:58 字數 1152 閱讀 9304

描述

一張普通的西洋棋棋盤,它被分成 8 乘 8 (8 行 8 列) 的 64 個方格。設有形狀一樣的多公尺諾牌,每張牌恰好覆蓋棋盤上相鄰的兩個方格,即一張多公尺諾牌是一張 1 行 2 列或者 2 行 1 列的牌。那麼,是否能夠把 32 張多公尺諾牌擺放到棋盤上,使得任何兩張多公尺諾牌均不重疊,每張多公尺諾牌覆蓋兩個方格,並且棋盤上所有的方格都被覆蓋住?我們把這樣一種排列稱為棋盤被多公尺諾牌完美覆蓋。這是乙個簡單的排列問題,同學們能夠很快構造出許多不同的完美覆蓋。但是,計算不同的完美覆蓋的總數就不是一件容易的事情了。不過,同學們 發揮自己的聰明才智,還是有可能做到的。

現在我們通過計算機程式設計對 3 乘 n 棋盤的不同的完美覆蓋的總數進行計算。

任務對 3 乘 n 棋盤的不同的完美覆蓋的總數進行計算。

輸入一次輸入可能包含多行,每一行分別給出不同的 n 值 ( 即 3 乘 n 棋盤的列數 )。當輸入 -1 的時候結束。

n 的值最大不超過 30.

輸出針對每一行的 n 值,輸出 3 乘 n 棋盤的不同的完美覆蓋的總數。

樣例輸入

2 8

12 -1

樣例輸出

3 153

2131

思路:

設a[i]為n=i時的方法數.i為奇數的時候肯定為0.

如果i為偶數,a[i]可以看成a[i-2]加上兩個單位組成的,此時多出來的2單位有3種方法..

也可以看成a[i-4]加上四個單位組成的,此時這四個單位一定是連在一起的,中間不能分割,所以只有兩種放法.

同理,可看成a[i-6]加上六個單位組成的,此時這六個單位也連在一起,不能分割,只有兩種放法…

直到所有的磚塊都是連在一起的,中間不能分割,也只有兩種放法.

所以 a[i]=3*a[i-2]+2*(a[i-4]+a[i-6]+…+a[0]) ①

a[i-2]=3*a[i-4]+2*(a[i-6]+…a[0]) ②

①-②,得a[i]=4*a[i-2]-a[i-4].

**:

#include 

#include

int main()

while(scanf("%d",&n)&&n!=-1)

else

printf("%i64d\n",a[n]);

}return

0;}

POJ 2663 完美覆蓋問題

此題是北大演算法課的遞迴作業。想了半天也找不出遞推公式。網上的文章都是直接給出結論,而沒有推導過程,無異於耍流氓。繼續尋找,直到看到此文才終於明白。首先,列數n肯定要是偶數,因為n 3 2得是整數。然後我們來想遞推公式。因為n是偶數,所以n 1,n 3這種奇數列,必然無法完全覆蓋。我們不考慮。首先,...

POJ 2663 Tri Tiling 完美覆蓋

一張普通的西洋棋棋盤,它被分成 8 乘 8 8 行 8 列 的 64 個方格。設有形狀一樣的多公尺諾牌,每張牌恰好覆蓋棋盤上相鄰的兩個方格,即一張多公尺諾牌是一張 1 行 2 列或者 2 行 1 列的牌。那麼,是否能夠把 32 張多公尺諾牌擺放到棋盤上,使得任何兩張多公尺諾牌均不重疊,每張多公尺諾牌...

POJ 第三週 程式設計題 1 完美覆蓋

自己做完之後對比了下網上的解題思路都是歸納出遞迴式直接求值,這裡給出我的乙個搜尋方法。思路 include include using namespace std const int row 3 struct point point nextpoint char a,int x,int y,int ...