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

来源:互联网 发布:python实现支持向量机 编辑:程序博客网 时间:2024/05/21 06:35
三个盘子为A,B,C,其中C是中介盘,我们要遵守移动规则将A上的盘子要全部通过B移动到C。
#include<iostream>#include<stdlib.h>using namespace std;#define MaxSize 50typedef 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');}

原创粉丝点击