SQL 漢諾塔

xuexiaogang發表於2021-12-11

SQL 漢諾塔 自己原文公眾號: https://mp.weixin.qq.com/s/0zh6zm_BoUnalAqvVD6qDg

上週我釋出了一個SQL寫的海盜分金子的(那個SQL不是我寫的,我只是轉述)。同樣今天的這個也不是我寫的。

    背景是這樣的一個遊戲(這個遊戲我是不會玩,但是見過),沒想到我玩都不會玩的遊戲,有人用SQL寫了。

      漢諾塔是源自印度神話裡的玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片黃金圓盤。 

大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。傳說在印度,有這麼一個古老的傳說:在世界中心貝拿勒斯(在印度北部)的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有一個僧侶在按照下面的法則移動這些金片:一次只移動一片,不管在哪根針上,小片必須在大片上面。僧侶們預言,當所有的金片都從梵天穿好的那根針上移到另外一根針上時,世界就將在一聲霹靂中消滅,而梵塔、廟宇和眾生也都將同歸於盡。

     題目要求

題目要求:用SQL找出最少移動次數,並且給出一種移法。
例子:3個圓盤
輸入:N=圓盤個數

每個步驟表示將一個柱子上的最上面一個圓盤移到另一個柱子。比如1->2 就是將1號柱最上方的圓盤放到2號柱的最上方。


假設有N個盤,最底下的N號盤在移動的時候,目標的柱子一定是空的。所以所有的其他N-1個盤子必定全部在另一柱子上。
把N號盤移過去之後,N-1要疊加到這個盤上面,和剛才移動N-1個盤子的方法是一樣的,只不過柱子的編號不同。
用遞迴SQL和MODEL都可以輕易寫出來。

SQL解答


每個步驟表示將一個柱子上的最上面一個圓盤移到另一個柱子。比如1->2 就是將1號柱最上方的圓盤放到2號柱的最上方。


假設有N個盤,最底下的N號盤在移動的時候,目標的柱子一定是空的。所以所有的其他N-1個盤子必定全部在另一柱子上。
把N號盤移過去之後,N-1要疊加到這個盤上面,和剛才移動N-1個盤子的方法是一樣的,只不過柱子的編號不同。
用遞迴SQL和MODEL都可以輕易寫出來。

SQL解答


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/637517/viewspace-2847127/,如需轉載,請註明出處,否則將追究法律責任。

相關文章