1. 程式人生 > >BZOJ 1019: [SHOI2008]漢諾塔

BZOJ 1019: [SHOI2008]漢諾塔

首都 補充 當我 傳說 http 邊界 com 基礎 下一步

看到我的博客的人大概也已經看過Sengxian的題解了吧?如果沒有的話建議先花15分鐘去看看他的,因為這篇文章是在Sengxian的題解上加一點點補充說明。

我看了好幾篇博客,幾乎就兩種做法:一種是跟Sengxian的做法類似的或一樣的,用遞推關系求^o^另一種比較玄學的是猜通項公式( ̄▽ ̄)(其實是待定系數啦)

當然我比較喜歡遞推的做法,畢竟通項公式不好證明正確性(也可能是我沒有多想想(′▽`))

這裏先多扯一句,漢諾塔又叫河內塔,而河內是越南首都,然而河內塔問題源於一個印度傳說(′?_?`)

我的博客就是解決一個很簡單的問題:怎樣證明題目中說的“上述策略一定能完成漢諾塔遊戲”?

單純的看,這個問題好像沒有很好的思路來想。作為一個長期滑水選手當然先看了題解然後切掉這題再回頭想這個問題。

不過當我照著題解看明白思路後,證明就是很顯然的了。

題解一句話總結:g代表終點柱子,f代表步數。兩種情況遞推。

既然要遞推,就要處理好邊界情況。這題的邊界就是只有一個碟子的情況。步數是1,無論采取什麽優先策略都有解^_^

兩個碟子的情況,首先移開小碟子到a。大碟子這時在b,下一步只能把大碟子移到c。下面移動小碟子。按照優先級小碟子要麽移到b要麽移到c。如果移到c的話,就完了。如果移到b的話,大碟子從c回到a,小碟子按照第一步的優先級從b到a。於是兩個碟子是有解的。有解的含義不僅是可以確定移動方式,也可以確定數組g和f的值。

(如果上面的一串已經把你攪暈了,那麽請再看一遍^_^)

下面就是正經的歸納了:

假設問題在n=k時有解。當n=k+1時,按照Sengxian的解法,可以在n=k有解的基礎上構造一組移動方式,使得k+1個碟子也可以移動到不同於初始柱子的碟子上。即n=k+1時也有解。

這樣,就通過歸納證明了“上述策略一定能完成漢諾塔遊戲”。

當然細心想想還是沒有完。怎麽證明Sengxian的構造法是正確的呢?這題是有優先級的限制,所以不是按照我們的想法隨意移動最大的碟子,但通過問題的性質可以發現按照規則可以移動到需要的地方。按照規則,小碟子不能移動兩次,只有大碟子可以移動一次。

我猜這題的證明過程已經解釋得很清楚了。

%%%Sengxian%%%

BZOJ 1019: [SHOI2008]漢諾塔