1. Introduction
大梵天創(chuàng)造世界的時候做了三根柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規(guī)定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
Time Complexity
假設(shè)有n片,移動次數(shù)是f(n).顯然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不難證明f(n)=2^n-1。
Pseudocode
/**
*
* @param n 盤子的數(shù)目
* @param origin 源座
* @param assist 輔助座
* @param destination 目的座
*/
public void hanoi(int n, char origin, char assist, char destination) {
if (n == 1) {
move(origin, destination);
} else {
hanoi(n - 1, origin, destination, assist);
move(origin, destination);
hanoi(n - 1, assist, origin, destination);
}
}
思想就是把上面的n-1移到輔助座,把最底下的移到目的座。再把輔助座的移到目的座。具體怎么移動就用遞歸。
漢諾塔問題的研究
由問題發(fā)現(xiàn)每次都是先移動第一個開始,最后一次最后移動且只移動一次。

image.png
所以當(dāng)問,第N個的需要移動次數(shù),就可以使用公式了
OJ
HDU1207
HDU1995
HDU1996
HDU1997
HDU2064
HDU2077
HDU2175
HDU2184
HDU2511
HDU2587