1. 程式人生 > 實用技巧 >Hanoi漢諾塔問題

Hanoi漢諾塔問題

問題描述

輸入格式

輸出格式

樣例輸入

3

樣例輸出

A--->C

A--->B

C--->B

A--->C

B--->A

B--->C

A--->C

題解

當n=1時,移動步驟為

    A--->C

當n=2時,移動步驟為

    A--->B

    A--->C

    B--->C

當n=3時,移動步驟為

    A--->C

    A--->B

    C--->B

    A--->C

    B--->A

    B--->C

    A--->C

我們先把A座上的圓盤從上到下編號

觀察以上三種情況,當我們想把A座上從上往下第i個圓盤移到C座上時,我們可以先把前i-1個圓盤移到B座上,然後把第i個圓盤移到C座上,再把B座上所有圓盤移到C座上

而前i-1個圓盤從A座移到B座的過程,和前i個圓盤從A座移到C座的過程類似,都是把一堆圓盤從一根柱子移到另一根柱子,且保證所有圓盤的相對位置在移動前後保持不變

我們把前i-1個圓盤從A座移到B座,可以先把前i-2個圓盤移到C座,然後把第i-1個圓盤移到B座,再把前i-2個圓盤移到B座

把前i-2個圓盤移到C座,可以先把前i-3個圓盤移到B座,然後把第i-2個圓盤移到C座,再把前i-3個圓盤移到C座

……

於是我們考慮遞迴

我們定義一個函式hanoi(int n,char a,char b,char c),表示把前n個圓盤按上述步驟從a座移到c座(a,b,c用於儲存三根柱子的編號,其中a的值可能為’A’,’B’,’C’;b,c也是)

如果當前A座上只剩1個圓盤,直接移到C座上並列印路徑

否則,先把前n-1個圓盤移到b座,即hanoi(n-1,a,c,b),然後把第n個圓盤從a座移到c座(列印路徑),再把前n-1個圓盤從b座移到c座,即hanoi(n-1,b,a,c)

 1 #include <stdio.h>
 2 
 3 void hanoi(int n,char a,char b,char c)
 4 {
 5     if (n==1) printf("%c--->%c\n",a,c);
 6     else
 7     {
 8         hanoi(n-1,a,c,b);
 9
printf("%c--->%c\n",a,c); 10 hanoi(n-1,b,a,c); 11 } 12 return; 13 } 14 15 int main() 16 { 17 int n; 18 scanf("%d", &n); 19 hanoi(n, 'A', 'B', 'C'); 20 return 0; 21 }