Hanoi漢諾塔問題——遞歸與函數自調用算法


題目描述 Description

有N個圓盤,依半徑大小(半徑都不同),自下而上套在A柱上,每次只允許移動最上面一個盤子到另外的柱子上去(除A柱外,還有B柱和C柱,開始時這兩個柱子上無盤子),但絕不允許發生柱子上出現大盤子在上,小盤子在下的情況,現要求設計將A柱子上N個盤子搬移到C柱去的方法。 

輸入輸出格式 Input/output
輸入格式:
一行,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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM