把A杆上的金盤全部移到C杆上,並仍保持原有順序疊好。
操作規則:
每次只能移動一個盤子,並且在移動過程中三根杆上都始終保持大盤在下,小盤在上,操作過程中盤子可以置於A、B、C任一杆上。
思路:
圖解:
示例:
當有兩個盤a,b時
示例:
當有三個盤a,b,c時
算法分析(遞歸算法):
實現這個算法可以簡單分爲三個步驟:
(1) 把n-1個盤子由A 移到 B;
(2) 把第n個盤子由 A移到 C;
(3) 把n-1個盤子由B 移到 C;
從這裏入手,在加上上面數學問題解法的分析,我們不難發現,移到的步數必定爲奇數步:
(1)中間的一步是把最大的一個盤子由A移到C上去;
(2)中間一步之上可以看成把A上n-1個盤子通過藉助輔助塔(C塔)移到了B上,
(3)中間一步之下可以看成把B上n-1個盤子通過藉助輔助塔(A塔)移到了C上
遞歸的代碼實現
```#include<stdio.h>
void hanoi(int n, char source, char goal, char temp)
{
if (n == 1)
{
printf("Move %d :from %c to %c\n", n, source, goal); //將第n個盤子從source移動到goal
}
else
{
hanoi(n - 1, source, goal, temp);
//將n-1個盤子藉助goal從source移動到temp
printf("Move %d :from %c to %c\n", n, source, goal);
//將第n個盤子從source移動到goal
hanoi(n - 1, temp, goal, source);
//將n-1個盤子藉助source從temp移動到goal
}
}
int main()
{
int n = 0;
printf("請輸入盤子的個數:");
scanf("%d", &n);
hanoi(n, 'A', 'B', 'C');//藉助B杆將A中盤移動到C上
return 0;
}```