汉诺塔--递归和非递归实现

简介:
复制代码
 1 #include <iostream>
 2 #include <stack>
 3 #include <assert.h>
 4 using namespace std;
 5 
 6 class HANOI
 7 {
 8 private:
 9     struct HanioData{
10         int x;//所在盘子编号
11         int y;//移动后所在编号
12         int n;//盘子数
13     };
14     HanioData hd;
15     static int c;
16     stack<HanioData> m_stack;
17     inline void move(int x,int z,int n)const
18     {
19         cout<<""<<c++<<"步: 将"<<n<<"号盘从"<<x<<"座移动到"<<z<<""<<endl;
20     }
21 public:
22     //递归实现
23     void hanoi(int n,int x,int y,int z)const
24     {
25         if(n==1)
26             move(x,z,1);
27         else
28         {
29             hanoi(n-1,x,z,y);
30             move(x,z,n);
31             hanoi(n-1,y,x,z);
32         }
33     }
34     //非递归实现
35     void hanoi(int n,int x,int y)
36     {
37         assert(n>0&&x>0&&y>0&&y<4&&x!=y);
38         hd.n=n;
39         hd.x=x;
40         hd.y=y;
41         c=0;
42         while (hd.n||!m_stack.empty())
43         {
44             while(hd.n)
45             {
46                 hd.n--;
47                 m_stack.push(hd);
48                 hd.y^=hd.x;
49             }
50             if(!m_stack.empty())
51             {
52                 hd=m_stack.top();
53                 m_stack.pop();
54                 move(hd.x,hd.y,hd.n+1);
55                 hd.x^=hd.y;
56             }
57         }
58 
59     }
60 };
61 
62 int HANOI::c = 0;
63 
64 int main()
65 {
66     HANOI H;
67     int n;
68     int p[3] = {1,2,3};
69     cout<<"3个塔座为"<<p[0]<<" "<<p[1]<<" "<<p[2]<<",目的:从"<<p[0]<<"座移动到"<<p[2]<<"座。请输入圆盘数:";
70     cin>>n;
71     cout<<"递归求解:"<<endl;
72     H.hanoi(n,p[0],p[1],p[2]);
73     cout<<"非递归求解:"<<endl;
74     H.hanoi(n,p[0],p[2]);
75 
76     return 0;
77 }
复制代码

本文转自cococo点点博客园博客,原文链接:http://www.cnblogs.com/coder2012/archive/2012/11/09/2763418.html,如需转载请自行联系原作者

相关文章
|
1月前
|
Java Python
汉诺塔递归问题,递归思路详解
汉诺塔递归问题,递归思路详解
36 0
|
1月前
|
机器学习/深度学习
利用函数递归求汉诺塔问题
利用函数递归求汉诺塔问题
36 0
|
8月前
汉诺塔问题(递归操作)
汉诺塔问题(递归操作)
|
11月前
汉诺塔 递归问题
汉诺塔 递归问题
66 0
|
11月前
递归和非递归分别实现求第n个斐波那契数
递归和非递归分别实现求第n个斐波那契数
47 0
递归问题的实际运用:汉诺塔问题
递归问题的实际运用:汉诺塔问题
84 0
递归问题的实际运用:汉诺塔问题
汉诺塔(递归+ 非递归版)
汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题。在A,B,C三根柱子上, 有n个不同大小的圆盘(假设半径分别为1-n吧),一开始他们都叠在我A上(如图所示),你的目标是在最少的合法移动步数内将所有盘子从A塔移动到C塔。 游戏中的每一步规则如下:
194 1
汉诺塔(递归+ 非递归版)