1. Introduction
大梵天創(chuàng)造世界的時候做了三根柱子榜揖,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上债查。并且規(guī)定,在小圓盤上不能放大圓盤随闽,在三根柱子之間一次只能移動一個圓盤社牲。
Time Complexity
假設有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
所以當問蚁袭,第N個的需要移動次數(shù),就可以使用公式了
OJ
HDU1207
HDU1995
HDU1996
HDU1997
HDU2064
HDU2077
HDU2175
HDU2184
HDU2511
HDU2587