想下山的小和尚

在《演算法之道》中看到這樣一個問題(文字描述按本強迫症重度晚期的習慣略作調整):


在深山中的寶珠寺里有一個年輕的小和尚叫做「哀青」(哀嘆青春,這名字起的就不吉利),他想要下山去

他的師父告訴他「山下的女人是老虎」,小和尚於是問道那為什麼不直接叫做「女老虎」啊?師父說:這個叫做比喻

小和尚:我想/問問問問/問我該怎麼脫身/你卻說/花花世界/不必當真/多麼傷人。

老和尚只好給他一個金缽,裝有27顆佛珠,其中15顆為紅色,12顆為綠色(而旁邊還有一大筐紅色佛珠和一大筐綠色佛珠)。每天寺廟的晨鐘響起時,小和尚可進行如下2個操作中的任意1個:

  1. 如果缽中裡面至少有3顆紅色的佛珠,則和尚可以從缽中取出3顆紅色的佛珠,並放入2顆綠色的佛珠(即用2顆綠色佛珠替換3顆紅色佛珠)。——記之為 f 操作。
  2. 將缽中的所有佛珠置換為另一種顏色的佛珠(即將原來的紅色佛珠替換為綠色佛珠。將原來的綠色佛珠替換為紅色佛珠)。——記之為 g 操作。

例如在第1次鐘聲響起時,小和尚可將缽里的3顆紅色佛珠拿走,並加入2顆綠色佛珠,這樣,缽里將有12顆紅色佛珠和14顆綠色佛珠;在第2次鐘聲響起時,小和尚可將缽中每顆佛珠都置換為相反的顏色,這樣,缽里將有14顆紅色佛珠和12顆綠色佛珠……

當缽中只剩下5顆紅色佛珠和5顆綠色佛珠時,小和尚就可以離開寶珠寺下山去享受精彩而又無奈的外面的世界了。

請問:小和尚應該如何操作才能離開寶珠寺?


(x,y) 表示缽中的紅色佛珠數和綠色佛珠數。則開始時表示為 (15,12) ,目標是 (5,5)

於是兩種操作就是兩個函數 f(x,y)=(x-3,y+2)g(x,y)=(y,x)

好了,下面開始解決問題,而首先要分析問題,看能得到些什麼:


1. 執行操作的次數

如果用 s(x,y)=x+y 表示缽中的紅色佛珠數和綠色佛珠數之和。

g 操作不改變這個值,即 s(g(x,y))=s(x,y)

f 操作將這個值減少1,即 s(f(x,y))=s(x,y)-1

初始情況 s(15,12)=27 ,目標情況 s(5,5)=10

因此必定是進行了17次 f 操作


2.

d(x,y)=|x-y| 表示缽中的紅色佛珠數和綠色佛珠數之差(的絕對值)。

g 操作不改變這個值,即 d(g(x,y))=d(x,y)

而對於 f 操作來說, d(f(x,y))=|x-y-5|

由於目標狀態下 d(5,5)=0 ,因此在操作過程中 d(x,y)都應該保持是5的倍數 。

而最初情況時 d(15,12)=3 ,所以無論如何也不可能僅使用這兩種操作達到目標。


3. 下面從操作序列入手進行分析。

首先,很明顯兩次 g 操作相當於沒有進行任何操作,因此操作次序必定是「若干次連續的 f 操作」和「1次 g 操作」交替進行。

其次,可以驗證

  1. f^acirc gcirc f^bcirc gcirc f^c=gcirc f^bcirc gcirc f^{a+c}
  2. f^acirc gcirc f^b circ g=gcirc f^acirc gcirc f^b

於是可以將所有包含17個 f 操作的操作序列簡化為下述5種之一:

  1. f^{17}
  2. f^{17}circ g
  3. gcirc f^{17}
  4. f^{x}circ g circ f^{17-x}
  5. gcirc f^{x}circ g circ f^{17-x}

然後最多進行1+1+1+16+16=35次驗證後就知道,小和尚無論怎樣做都是徒勞無功的。

簡化過程例如:


許多年後,滄海桑田白雲蒼狗,小和尚也變成了老和尚,當新的小和尚問起他山下什麼樣的時侯,新的老和尚(舊的小和尚)只是默默遞給他一個的裝有15顆紅色佛珠和12顆綠色佛珠金缽,然後轉過身去,嘴角喃喃道:有一個聲音/它說/哀青/沒離開過……


推薦閱讀:

如何修改double類型的精度為小數點後3位?
兩個矩形的相交面積,怎麼求演算法效率相對較高?
BitDegradeTree詳解[多圖]
如何設計演算法計算三維空間中n個點的凸包表面積?
面試系列之一:關於前端面試演算法的一些建議

TAG:趣味数学 | 算法 |