漢諾塔問題 漢諾塔的算法就3個步驟:
第一,把a上的n-1個盤通過c移動到b。 第二,把a上的最下面的盤移到c。
第三,因為n-1個盤全在b上了, 所以把b當做a重復以上步驟就好了。所以算法看起來就簡單多了。 不過,思考過程還是很痛苦的,難以理解。遞歸中會保存數據的好處在這里又得到體現
//2014-4-2 23:54 漢諾塔完整程序 //比較難於理解,要反復琢磨 # include <stdio.h> void hannuota(int n, char A, char B, char C)//此函數代碼比較難懂,好好反復想明白 { /*如果是1個盤子 直接將A柱子上的盤子從A移到C 否則 先將A柱子上的n-1個盤子借助C移到B 然后將A柱子上的盤子從A移到到C 最后將B柱子上的n-1個盤子借助A移到C */ if (1 == n ) { printf("將編號為%d的盤子直接從%c柱子移到%c柱子\n", n, A, C); } else { hannuota(n-1, A, C, B); printf("將編號為%d的盤子直接從%c柱子移到%c柱子\n", n, A, C); hannuota(n-1, B, A, C); } } int main(void) { char ch1 = 'A'; char ch2 = 'B'; char ch3 = 'C'; int n; printf("請輸入要移動盤子的個數:\n"); scanf("%d", &n); hannuota(n, 'A', 'B', 'C'); }
補充:
漢諾塔問題(又稱河內塔問題)是根據一個傳說形成的一個問題:
有三根桿子A,B,C.A桿上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小.要求按下列規則將所有圓盤移至C桿:
1.每次只能移動一個圓盤;
2.大盤不能疊在小盤上面.
可將圓盤臨時置於B桿,也可將從A桿移出的圓盤重新移回A桿,但都必須尊循上述兩條規則.