題目:
即將n個盤子從起始柱(標記為「a」)通過借助柱(標記為「b」)移動到目標柱(標記為「c」)
解法一、非遞迴演算法
所有的漢諾塔移動可以總結為重複的兩步,我們假設現在最小的圓盤在a柱子上,柱子為a,b,c
第二步:對a柱子和c柱子進行頂上最小的元素進行判斷,把小一點的那個圓盤移動到大一點的那個圓盤(有空則摞在空柱子上)。
重複上述兩步,直到兩根柱子均空結束。
注意:這樣得到的最後的答案不一定是摞在c上,如果n是偶數將摞在b上,所以如果n是偶數我們就令第二個柱子為c,第三個柱子為b,這樣就一定最後是摞在c上的。
1 #include 2 #include3#define elemtype char
4#define error -1
5#define max 1000
6 typedef enum bool;
8 typedef struct
*stack;
13 stack a[4
];14
char c[4]= ;//
柱子編號從1開始
15 stack createstack(int
maxsize)
22bool
isempty(stack s)
27bool
isfull(stack s)
32bool
push(stack s,elemtype x)
38elemtype pop(stack s)
43elemtype gettop(stack s)
4647
bool move(int before,int
after)
54push(a[after],pop(a[before]));
55 printf("
%c -> %c\n
",c[before],c[after]);56}
57int
main()
64if(n%2==1
) 68
for(i=0; i)
71int cnt=0;72
while(++cnt)
77 }
解法二、遞迴演算法
第1步:將n-1個盤從a->b; hannoi(n-1,a,b,c)
第2步:將第n個盤從a->c;(遞迴出口) printf("a -> c")
第3步:再將n-1個盤從b->c;hannoi(n-1,b,c,a)
注意傳入引數後 a='a',b='c',c='b';
#include int hanoi(int n,char a,char b,charc) }
intmain()
漢諾塔非遞迴演算法
輸入格式 輸入為乙個正整數n,即起始柱上的盤數。輸出格式 每個操作 移動 佔一行,按柱1 柱2的格式輸出 輸入樣例 3輸出樣例 a c a b c b a c b a b c 乙個美國學者總結得到 所有的漢諾塔移動可以總結為重複的兩步,我們假設現在最小的圓盤在a柱子上,柱子為a,b,c 第二步 對a...
非遞迴 遞迴 漢諾塔演算法實踐
漢諾塔演算法是很多公司的面試題,經常會讓手寫,這裡總結了一下 1 最最最常見的也是最簡單的漢諾塔演算法,遞迴 這也是學習遞迴的乙個經典演算法題 漢諾塔演算法 遞迴 ps 列印移動過程 param level 層數 param from 起始位置 param to 目標位置 param other 多...
漢諾塔問題的遞迴和非遞迴演算法
漢諾塔問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。如果考慮一下把64片金盤,由一...