c递归实现 汉诺塔
1 漢諾塔描述:
?漢諾塔(又稱河內塔)問題是源于印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
2漢諾偽算法:
當只有一個盤子的時候,只需要從將A塔上的一個盤子移到C塔上。
當A塔上有兩個盤子是,先將A塔上的1號盤子(編號從上到下)移動到B塔上,再將A塔上的2號盤子移動的C塔上,最后將B塔上的小盤子移動到C塔上。
當A塔上有3個盤子時,先將A塔上編號1至2的盤子(共2個)移動到B塔上(需借助C塔),然后將A塔上的3號最大的盤子移動到C塔,最后將B塔上的兩個盤子借助A塔移動到C塔上。
?當A塔上有n個盤子是,先將A塔上編號1至n-1的盤子(共n-1個)移動到B塔上(借助C塔),然后將A塔上最大的n號盤子移動到C塔上,最后將B塔上的n-1個盤子借助A塔移動到C塔上。
? 綜上所述,除了只有一個盤子時不需要借助其他塔外,其余情況均一樣(只是事件的復雜程度不一樣)
3 假設盤子為3個時候,圖描述
4 c語言完整代碼
#include<stdio.h>int num = 0; //計數器,計算用了多少步 char A = 'A',B = 'B',C = 'C'; // 模擬A,B,C三個塔/*getOther函數為得到另外一個塔名稱,假設 from = A ,to = B,那么返回為 C */ char getOther(char from,char to){if(A != from && A != to){return A;}else if(B != from && B != to){return B;}else{return C;} }//用來輸出從哪個塔移動到哪個塔 void move(char from ,char to){num++;printf("第%d步 : %c --> %c\n",num,from,to); };//實現函數 void Hanoi(int n ,char from,char to){if(n==1){move(from,to);}else{char other = getOther(from,to);Hanoi(n-1,from,other);move(from,to);Hanoi(n-1,other,to);} }int main(){int n = 2; printf("有 %d 個盤子時候 : \n",n); Hanoi(n,'A','C'); return 1; };
5 輸出結果圖
5.1?假設有2個盤子
5.2 假設有3個盤子
5.3 假設有64個盤子,電腦跑了半個小時,還沒有計算完。。。汗。。。垃圾配置,就不貼圖了.
總結
- 上一篇: 算法导论-算法基础-2.1插入排序 (从
- 下一篇: C实现二叉树的先序遍历,中序遍历,后序遍