想下山的小和尚
在《演算法之道》中看到這樣一個問題(文字描述按本強迫症重度晚期的習慣略作調整):
在深山中的寶珠寺里有一個年輕的小和尚叫做「哀青」(哀嘆青春,這名字起的就不吉利),他想要下山去。
他的師父告訴他「山下的女人是老虎」,小和尚於是問道那為什麼不直接叫做「女老虎」啊?師父說:這個叫做比喻。
小和尚:我想/問問問問/問我該怎麼脫身/你卻說/花花世界/不必當真/多麼傷人。
老和尚只好給他一個金缽,裝有27顆佛珠,其中15顆為紅色,12顆為綠色(而旁邊還有一大筐紅色佛珠和一大筐綠色佛珠)。每天寺廟的晨鐘響起時,小和尚可進行如下2個操作中的任意1個:
- 如果缽中裡面至少有3顆紅色的佛珠,則和尚可以從缽中取出3顆紅色的佛珠,並放入2顆綠色的佛珠(即用2顆綠色佛珠替換3顆紅色佛珠)。——記之為 操作。
- 將缽中的所有佛珠置換為另一種顏色的佛珠(即將原來的紅色佛珠替換為綠色佛珠。將原來的綠色佛珠替換為紅色佛珠)。——記之為 操作。
例如在第1次鐘聲響起時,小和尚可將缽里的3顆紅色佛珠拿走,並加入2顆綠色佛珠,這樣,缽里將有12顆紅色佛珠和14顆綠色佛珠;在第2次鐘聲響起時,小和尚可將缽中每顆佛珠都置換為相反的顏色,這樣,缽里將有14顆紅色佛珠和12顆綠色佛珠……
當缽中只剩下5顆紅色佛珠和5顆綠色佛珠時,小和尚就可以離開寶珠寺下山去享受精彩而又無奈的外面的世界了。
請問:小和尚應該如何操作才能離開寶珠寺?
用 表示缽中的紅色佛珠數和綠色佛珠數。則開始時表示為 ,目標是 。
於是兩種操作就是兩個函數 和 。
好了,下面開始解決問題,而首先要分析問題,看能得到些什麼:
1. 執行操作的次數
如果用 表示缽中的紅色佛珠數和綠色佛珠數之和。
則 操作不改變這個值,即 。
而 操作將這個值減少1,即 。
初始情況 ,目標情況 。
因此必定是進行了17次 操作!
2.
用 表示缽中的紅色佛珠數和綠色佛珠數之差(的絕對值)。
則 操作不改變這個值,即 。
而對於 操作來說, 。
由於目標狀態下 ,因此在操作過程中 都應該保持是5的倍數 。
而最初情況時 ,所以無論如何也不可能僅使用這兩種操作達到目標。
3. 下面從操作序列入手進行分析。
首先,很明顯兩次 操作相當於沒有進行任何操作,因此操作次序必定是「若干次連續的 操作」和「1次 操作」交替進行。
其次,可以驗證
於是可以將所有包含17個 操作的操作序列簡化為下述5種之一:
然後最多進行1+1+1+16+16=35次驗證後就知道,小和尚無論怎樣做都是徒勞無功的。
簡化過程例如:
許多年後,滄海桑田白雲蒼狗,小和尚也變成了老和尚,當新的小和尚問起他山下什麼樣的時侯,新的老和尚(舊的小和尚)只是默默遞給他一個的裝有15顆紅色佛珠和12顆綠色佛珠金缽,然後轉過身去,嘴角喃喃道:有一個聲音/它說/哀青/沒離開過……
推薦閱讀:
※如何修改double類型的精度為小數點後3位?
※兩個矩形的相交面積,怎麼求演算法效率相對較高?
※BitDegradeTree詳解[多圖]
※如何設計演算法計算三維空間中n個點的凸包表面積?
※面試系列之一:關於前端面試演算法的一些建議