遞歸解決漢諾塔問題

題目來自百度百科:算法

漢諾塔:漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候作了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序從新擺放在另外一根柱子上。而且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。spa

 

 

c語言實現(假設最開始放64片黃金圓盤的柱子爲A, 要移動到C柱子上,藉助的介質爲B柱子):code

 

 1 #include <stdio.h>
 2  /*
 3   * 僞算法(要移動盤子的柱子爲A,藉助的介質柱子爲B,移動到目的柱子爲C.
 4   * 若是盤子數爲1,則直接將盤子從A柱子移到C柱子。
 5   * 不然:
 6   *     step1:將A柱子上的N-1個盤子藉助於C柱子移動到B柱子上。
 7   *     step2:將A柱子上的第N個盤子直接移動到C柱子上。
 8   *     step3:將B柱子上的N-1個盤子藉助A柱子移動到C柱子上。
 9    */
10 
11  void hanoi( int n,  char A,  char B,  char C) {
12    if ( 1 == n) {
13      printf( " 將編號爲%d的盤子從%c柱子直接移動到%c柱子\n ", n, A, C);
14   }  else {
15        hanoi(n -  1, A, C, B);
16        printf( " 將編號爲%d的盤子從%c柱子直接移動到%c柱子\n ", n, A, C);
17        hanoi(n -  1, B, A, C);
18   }
19 }
20  int main( void) {
21      char A =  ' A ';
22      char B =  ' B ';
23      char C =  ' C ';
24 
25      int n;
26 
27     printf( " 請輸入柱子的個數: ");
28     scanf( " %d ", &n);
29 
30     hanoi(n, A, B, C);
31 
32      return  0;
33 }

 

結果:htm

 

 1 E:\tarbitrary\datastructure\recursion>gcc hanoi.c -o hanoi
 2 
 3 E:\tarbitrary\datastructure\recursion>hanoi
 4 請輸入柱子的個數: 3
 5 將編號爲1的盤子從A柱子直接移動到C柱子
 6 將編號爲2的盤子從A柱子直接移動到B柱子
 7 將編號爲1的盤子從C柱子直接移動到B柱子
 8 將編號爲3的盤子從A柱子直接移動到C柱子
 9 將編號爲1的盤子從B柱子直接移動到A柱子
10 將編號爲2的盤子從B柱子直接移動到C柱子
11 將編號爲1的盤子從A柱子直接移動到C柱子
相關文章
相關標籤/搜索