青蛙過河問題


一條小溪尺寸不大,青蛙可以從左岸跳到右岸,在左岸有一石柱L,面積只容得下一只青蛙落腳,同樣右岸也有一石柱R,面積也只容得下一只青蛙落腳。有一隊青蛙從尺寸上一個比一個小。我們將青蛙從小到大,用1,2,…,n編號。規定初始時這隊青蛙只能趴在左岸的石頭L上,按編號一個落一個,小的落在大的上面。不允許大的在小的上面。在小溪中有S個石柱,有y片荷葉,規定溪中的柱子上允許一只青蛙落腳,如有多只同樣要求按編號一個落一個,大的在下,小的在上,而且必須編號相鄰。對於荷葉只允許一只青蛙落腳,不允許多只在其上。對於右岸的石柱R,與左岸的石柱L一樣允許多個青蛙落腳,但須一個落一個,小的在上,大的在下,且編號相鄰。當青蛙從左岸的L上跳走后就不允許再跳回來;同樣,從左岸L上跳至右岸R,或從溪中荷葉或溪中石柱跳至右岸R上的青蛙也不允許再離開。問在已知溪中有S根石柱和y片荷葉的情況下,最多能跳過多少只青蛙?

為什么要寫這道題呢?因為自以為是導致亂寫程序,以為和漢諾塔一樣,只要有三根柱子就能移動無限的青蛙,其實不然,漢諾塔不能實現,每一次柱子上的盤子都是按序號排的,比如移動一個n層的盤子,需要將n-1個盤子移動到中介柱子,將最大的盤子放到目的柱子,以初始柱子為中介,將中介柱子的n-1個盤子移動到目的柱子,但是,加入初始柱子有n+1個盤子,此時操作不符合編號相鄰的原則,大意了。

然后,從這道題講,先假設柱子數為s,荷葉數為l。

顯然 s = 0 時,可過青蛙數為l+1。

若 s = 1, l = 1,將柱子 s1 當做 s = 0 時的R柱子,則s1上可有2個青蛙,此時R上亦是如此,可以得到兩只大青蛙,再將s1看做L則可以在R上增加兩個青蛙!

仿佛找到了關系, 假設函數為f,返回青蛙數, 則 f ( s, 1) = 2 * f ( s - 1, 1)

若l = 0, 上述關系顯然成立。

若s = 1, l >= 2, 可得到 (l+1)* 2 個!

若柱子增加呢, 實際上,就是先將 f ( s - 1, l)個放到 sn柱子上, 在將 f ( s - 1, l)放到R上,在以sn柱子為L,放到R上, 一共 2 * f ( s - 1, l)!


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com