三个盘子为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');
}