递归实现
#include <iostream> #include <stack> using namespace std; #define mvh(s, o) cout << (s) << "=>" << (o) << endl; void Hanoi(char a, char b, char c, int n) { if (n < 1) return; Hanoi(a, c, b, n - 1); mvh(a, c) Hanoi(b, a, c, n - 1); }
非递归实现
1 typedef struct HState 2 { 3 char a; 4 char b; 5 char c; 6 char flag; 7 int n; 8 } HState; 9 10 //非递归实现 11 void HanoiNo(char A, char B, char C, int n) 12 { 13 stack<HState> HSS; 14 15 HState hs1; 16 hs1.a = A; 17 hs1.b = B; 18 hs1.c = C; 19 hs1.flag = 0; 20 hs1.n = n; 21 22 HSS.push(hs1); 23 24 while (!HSS.empty()) 25 { 26 if (HSS.top().n < 1) 27 { 28 HSS.pop(); 29 if (!HSS.empty()) 30 HSS.top().flag ++; 31 } 32 else if (HSS.top().flag == 0) 33 { 34 HState hs; 35 hs.a = HSS.top().a; 36 hs.b = HSS.top().c; 37 hs.c = HSS.top().b; 38 hs.n = HSS.top().n - 1; 39 hs.flag = 0; 40 HSS.push(hs); 41 } 42 else if (HSS.top().flag == 1) 43 { 44 mvh(HSS.top().a, HSS.top().c) 45 HState hs; 46 hs.a = HSS.top().b; 47 hs.b = HSS.top().a; 48 hs.c = HSS.top().c; 49 hs.n = HSS.top().n - 1; 50 hs.flag = 0; 51 HSS.push(hs); 52 } 53 else if (HSS.top().flag == 2) 54 { 55 HSS.pop(); 56 if (!HSS.empty()) 57 HSS.top().flag ++; 58 } 59 else 60 { 61 cout << "error..." << endl; 62 break; 63 } 64 } 65 }
测试
#include <iostream> #include <stack> using namespace std; int main() { HanoiNo('A', 'B', 'C', 15); cout << "-------------------------------------" << endl; Hanoi('A', 'B', 'C', 15); return 0; }