資料結構與演算法 13骨牌鋪方格三例(遞推)

2021-10-02 11:25:30 字數 2336 閱讀 4301

【例1】

description

在2×n的乙個長方形方格中,用乙個1×2的骨牌鋪滿方格,輸入n ,輸出鋪放方案的總數. 例如n=3時,為2×3方格,骨牌的鋪放方案有三種,如下圖:

輸入資料由多行組成,每行包含乙個整數n,表示該測試例項的長方形方格的規格是2×n (0< n<=50)。

output

對於每個測試例項,請輸出鋪放方案的總數,每個例項的輸出佔一行。

sample input13

2sample output13

2參考程式

#include

#define len 50

intmain()

printf

("%lld\n"

,a[n]);

}return0;

}

分析

問題的本質是斐波那契數列。①當n=1時,骨牌只能豎放,即僅1種方案;②當n=2時:考慮第一塊骨牌,若豎放時,則剩餘乙個方格只能豎放.若橫放時,則一次性占用兩個方格,不再有多餘的空格。所以一共2種方案。③n個方格時,第一步考慮豎放,則後面剩餘的n-1個空餘方格通過前面的結果得出;也可以第一步考慮橫放,則後面n-2個空餘方格也可以通過前面的結果得出。根據分類加法原理,將兩類第一步下的方法加總,從而得到了遞推關係,即得到n個方格時的情形。

【例2】

description

在3×n的乙個長方形方格中,用乙個1×3的骨牌鋪滿方格,輸入n,輸出鋪放方案的總數. 例如n=4時,為3×4方格,骨牌的鋪放方案有3種。

input

輸入資料由多行組成,每行包含乙個整數n,表示該測試例項的長方形方格的規格是3×n (0< n<=50)。

output

對於每個測試例項,請輸出鋪放方案的總數,每個例項的輸出佔一行。

sample input12

34sample output11

23參考程式

#include

#define len 50

intmain()

printf

("%lld\n"

,a[n]);

}return0;

}

分析

與例1相同。①當n=1時,骨牌只能豎放,即僅1種方案;②當n=2時:無法橫放,兩塊骨牌都只能豎放,即僅1種方案;③當n=3時:考慮第一塊骨牌,若豎放時,則剩餘兩個方格也只能豎放,1種方案。若第一塊骨牌橫放時,則一次性占用3個方格,不再有多餘的空格,剩餘兩塊也都橫放,1種方案。所以一共2種方案。④n個方格時,第一步考慮豎放,則後面剩餘的n-1個空餘方格通過前面的結果得出;也可以第一步考慮橫放,則後面n-3個空餘方格也可以通過前面的結果得出。根據分類加法原理,將兩類第一步下的方案加總,從而得到了遞推關係,即n個方格時的情形。

【例3】

description

請在1×n的乙個長方形方格中,任選1×1、1×2和1×3的骨牌鋪滿方格, 輸入n,輸出鋪放方案的總數. 例如n=3時,為1*3的方格,骨牌的鋪放方案有4種

input

多組輸入,輸入到eof結束,每行包含乙個整數n,表示該測試例項的長方形方格的規格是1×n (0< n<=30)。

output

對於每個測試例項,請輸出鋪放方案的總數,每個例項的輸出佔一行。

sample input12

34sample output12

47參考程式

#include

#define len 50

intmain()

printf

("%lld\n"

,a[n]);

}return0;

}

分析

本題與前兩例略有不同,但思路仍是斐波那契數列。①當n=1時:只能選乙個1×1規格的骨牌填入,即僅1種方案;②當n=2時:可以填入兩個1×1規格的骨牌,也可以填入乙個1×2規格的骨牌,即2種方案;③當n=3時:第一步可以填入乙個1×1規格的骨牌,然後剩餘兩個空餘方格按n=2的情形計算,2種方案。第一步也可以一次性填入乙個1×2規格的骨牌,然後剩餘1個空餘方格按n=1的情形計算,1種方案。還可以一次性填入乙個1×3規格的骨牌,再沒有空餘的方格,1種方案。所以一共4種方案;④其他n個方格時:第一步可以填入1個1×1規格的骨牌,然後剩餘n-1個方格根據之前的結果得出。第一步也可以填入乙個1×2規格的骨牌,然後剩餘n-2個根據之前的結果得出。第一步還可以填入乙個1×3規格的骨牌,然後剩餘n-3個空餘方格根據之前的結果得出。根據分類加法原理,將三類第一步下的方法加總,從而得出遞推關係,即得到n個方格的情形。

資料結構與演算法(三)

變位詞是指兩個詞之間存在組成字母的 重新排列關係 如 heart和earth,python和typhon 為了簡單起見,假設參與判斷的兩個詞僅由小寫 字母構成,而且長度相等 詞1中的字元逐個在詞2中檢查是否存在,存在則標記防止重複檢查。如果每個字元都能找到,並且詞1詞2長度相同則是變位詞。否則不是。...

資料結構與演算法(三)

鍊錶由單向的鏈變成雙向鏈,使用這種資料結構,我們不再拘束於單鏈表的單向建立於遍歷等操作。在單鏈表中,有乙個資料域,還有乙個指標域,資料域用來儲存相關資料,而指標域負責鍊錶之間的 聯絡 在雙向鍊錶中,需要有兩個指標域,乙個負責向後連線,乙個負責向前連線。單鏈表的結構 struct list 雙向鍊錶的...

13 資料結構與演算法 快速排序

created by chen da 快速排序的思想 選擇基準值pivot將陣列分成兩個子陣列,小於基準值的元素和大於基準值的元素 這個過程稱為partition 對兩個子陣列進行快速排序 合併結果。乙個簡單粗暴的遞迴快排 def quik sort array if len array 2 ret...