汉诺塔递归方法和非递归方法

三个盘子为A,B,C,其中C是中介盘,我们要遵守移动规则将A上的盘子要全部通过B移动到C。
#include<iostream>
#include<stdlib.h>
using namespace std;
#define MaxSize 50
typedef struct
{
    int n;      //盘片的个数
    char x,y,z; //3个塔座
    bool flag;  //可直接移动盘片时true,否则false
}ElemType;      //顺序栈中元素类型
typedef struct
{
    ElemType data[MaxSize];//存放元素
    int top;   //栈顶指针
}StackType;    //顺序栈的类型
void InitStack(StackType *&s)//初始化
{
    s=(StackType *)malloc(sizeof(StackType));
    s->top=-1;
}
void DestoryStack(StackType *&s)//销毁栈
{
    free(s);
}
bool StackEmpty(StackType *s)//判断栈是否为空
{
    return(s->top==-1);
}
bool Push(StackType *&s,ElemType e)//进栈
{
    if(s->top==MaxSize-1)//栈满
        return false;
    s->top++;
    s->data[s->top]=e;
    return true;
}
bool Pop(StackType *&s,ElemType &e)//出栈
{
    if(s->top==-1)//栈为空
        return false;
    e=s->data[s->top];//取栈顶元素
    s->top--;         //栈顶指针减1
    return true;
}
void Hanoil(int n,char X,char Y,char Z)//递归方法
{
    if(n==1)
        cout<<"\t"<<"将第"<<n<<"个盘片从"<<X<<"移动到"<<Z<<endl;
    else
    {
        Hanoil(n-1,X,Z,Y);
        cout<<"\t"<<"将第"<<n<<"个盘片从"<<X<<"移动到"<<Z<<endl;
        Hanoil(n-1,Y,X,Z);
    }
}
void Hanoil2(int n,char x,char y,char z)
{
    StackType *st;       //定义顺序栈指针
    ElemType e,e1,e2,e3;
    if(n<=0)             //参数错误时,直接返回
        return;
    InitStack(st);      //初始化栈
    e.n=n;
    e.x=x;
    e.y=y;
    e.z=z;
    e.flag=false;
    Push(st,e);       //元素e进栈
    while(!StackEmpty(st))
    {
        Pop(st,e);    //出栈元素e
        if(e.flag==false)//当不能直接移动盘片时
        {
            e1.n=e.n-1;
            e1.x=e.y;
            e1.y=e.x;
            e1.z=e.z;
            if(e1.n==1) //只有一个盘片可以直接移动
                e1.flag=true;
            else        //有一个以上盘片时不能直接移动
                e1.flag=false;
            Push(st,e1); //处理Hanoi(n-1,y,x,z)步骤
            e2.n=e.n;
            e2.x=e.x;
            e2.y=e.y;
            e2.z=e.z;
            e2.flag=true;
            Push(st,e2);  //处理move(n,x,z)步骤
            e3.n=e.n-1;
            e3.x=e.x;
            e3.y=e.z;
            e3.z=e.y;
            if(e3.n==1)//只有一个盘片可以直接移动
                e3.flag=true;
            else       //有一个以上盘片时不能直接移动
                e3.flag=false;
            Push(st,e3);//处理Hanoi(n-1,x,z,y)步骤
        }
        else        //当可以直接移动时
            cout<<"\t"<<"将第"<<e.n<<"个盘片从"<<e.x<<"移动到"<<e.z<<endl;
    }
    DestoryStack(st);//销毁栈
}
int main()
{
    int n;
    cout<<"输入盘片个数,通过递归和非递归方法求解n个盘片的移动过程"<<endl;
    cin>>n;
    cout<<"采用递归方法求解Hanoi问题过程如下"<<endl;
    Hanoil(n,'A','B','C');
    cout<<"采用非递归方法求解Hanoi问题过程如下"<<endl;
    Hanoil2(n,'A','B','C');
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值