Hanoi漢諾塔問題
阿新 • • 發佈:2020-11-05
問題描述
輸入格式
輸出格式
樣例輸入
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); 9printf("%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 }