漢諾塔的遞迴和非遞迴實現
借助堆疊以非遞迴(迴圈)方式求解漢諾塔的問題(n, a, b, c),即將n個盤子從起始柱(標記為「a」)通過借助柱(標記為「b」)移動到目標柱(標記為「c」),並保證每個移動符合漢諾塔問題的要求。
輸入為乙個正整數n,即起始柱上的盤數。
每個操作(移動)佔一行,按柱1 -> 柱2
的格式輸出。
3
a -> c
a -> b
c -> b
a -> c
b -> a
b -> c
a -> c
**:(遞迴演算法)
ps:函式hanoi裡的n是n個盤子,move函式裡的n是第n個
1 #include 2遞迴的演算法,簡潔一點也可以這樣寫:int i=1;//
記錄步數
3void move(int n,char x,char y) //
將編號為n的盤子由from移動到to47
void hanoi(int n,char x,char y,char z)//
將n個盤子由初始塔移動到目標塔(利用借用塔)818
}19intmain()
20
void hanoi(int n,char a,char b,char c) //a借助b,將n個盤子移到c ,遞迴的妙用在於不用關心具體實現的細節
}
坦白說,關於非遞迴的演算法,沒什麼思路,就是用遞迴演算法跑一些數值,想出來的演算法也不是特別好
**:(非遞迴演算法)
1 #include2 #include3 #include 4 #include 5 #include6using
namespace
std;
7int temp1=-1, temp2=-1
; 8
char s[4] = ;//
為了解題簡便,我是從1開始算的
9 stack a[4
];
10int c1 = 0
; 11
int rank1[4
];
12bool compare(int a1,int
b1)
13
20bool move1(int before,int after)
30int
main()
43else
47for (i = 1; i <= 3; i++)//
初始化棧排序表
48 rank1[i] =i;
49int
tt;
50while (c1 < pow(2, n) -1
)
58else
59 move1(rank1[2], rank1[1
]);
60 tt = rank1[2
];
61}
62 }
遞迴和非遞迴實現漢諾塔問題
漢諾塔 又稱河內塔 問題其實是印度的乙個古老的傳說。開天闢地的神勃拉瑪 和中國的盤古差不多的神吧 在乙個廟裡留下了三根金剛石的棒,第一根上面套著64個圓的金片,最大的乙個在底下,其餘乙個比一 個小,依次疊上去,廟裡的眾僧不倦地把它們乙個個地從這根棒搬到另一根棒上,規定可利用中間的一根棒作為幫助,但每...
漢諾塔問題的遞迴和非遞迴實現
漢諾塔問題 古代有乙個梵塔,塔內有3個基座,a基座上有64個盤子,盤子大小不等,大的在下,小的在上。有乙個老和尚想把盤子由a座移到b座,但每次只能移動乙個盤子,3個基座上的盤子都始終保持大的在下,小的在上。移動過程中可以利用c基座做輔助,求解其移動過程。漢諾塔問題是遞迴演算法比較經典的例題,幾乎是每...
漢諾塔遞迴方法和非遞迴方法
三個盤子為a,b,c,其中c是中介盤,我們要遵守移動規則將a上的盤子要全部通過b移動到c。include includeusing namespace std define maxsize 50 typedef struct elemtype 順序棧中元素型別 typedef struct stac...