指尖起舞
手把青秧插满田,低头便见水中天;身心清静方为道,退步原来是向前。

导航

 

 

递归实现

#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;
}

 

posted on 2016-06-22 17:16  datakv  阅读(164)  评论(0编辑  收藏  举报