漢諾塔問題 漢諾塔的算法就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桿,但都必須尊循上述兩條規則.