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

BZOJ 1019: [SHOI2008]漢諾塔 簡要證明

先安利一發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%%%