題目描述 Description
有N個圓盤,依半徑大小(半徑都不同),自下而上套在A柱上,每次只允許移動最上面一個盤子到另外的柱子上去(除A柱外,還有B柱和C柱,開始時這兩個柱子上無盤子),但絕不允許發生柱子上出現大盤子在上,小盤子在下的情況,現要求設計將A柱子上N個盤子搬移到C柱去的方法。
輸入輸出格式 Input/output
輸入格式:
一行,n<=20
輸出格式:
一行,n<=20
輸出格式:
步數及各種圓盤要移動的步驟
輸入輸出樣例 Sample input/output
樣例測試點#1
輸入樣例:
2
輸出樣例:
1:From A to B
2:From A to C
3:From B to C
樣例測試點#2
輸入樣例:
3
輸出樣例:
1:From A to C
2:From A to B
3:From C to B
4:From A to C
5:From B to A
6:From B to C
7:From A to C
思路:
本題是典型的遞歸程序設計題。
(1)當N=1 時,只有一個盤子,只需要移動一次:A—>C;
(2)當N=2時,則需要移動三次:
A------ 1 ------> B, A ------ 2 ------> C, B ------ 1------> C.
(3)如果N=3,則具體移動步驟為:



假設把第3步,第4步,第7步抽出來就相當於N=2的情況(把上面2片捆在一起,視為一片):


所以可按“N=2”的移動步驟設計:
①如果N=0,則退出,即結束程序;否則繼續往下執行;
②用C柱作為協助過渡,將A柱上的(N-1)片移到B柱上,調用過程mov(n-1, a,b,c);
③將A柱上剩下的一片直接移到C柱上;
④用A柱作為協助過渡,將B柱上的(N-1)移到C柱上,調用過程mov (n-1,b,c,a)
代碼如下:
1 #include <stdio.h> 2 int k=0;//統計步數 3 void Hanoi(int n,char a,char b,char c) 4 { 5 if(n==0)//0的話,沒什么好玩的了,直接退出!! 6 { 7 return ; 8 } 9 else 10 { 11 Hanoi(n-1,a,c,b); 12 k++; 13 printf("%d:From %c to %c\n",k,a,c); 14 Hanoi(n-1,b,a,c); 15 } 16 } 17 int main() 18 { 19 int n; 20 scanf("%d",&n); 21 Hanoi(n,'A','B','C'); 22 return 0; 23 }
