汉诺塔递归方法和非递归方法
来源:互联网 发布: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');}
阅读全文
0 0
- 汉诺塔递归方法和非递归方法
- 采用递归和非递归方法求解汉诺塔问题
- 归并排序(递归和非递归方法实现)
- !采用递归和非递归方法求解F(n)
- 用递归和非递归的方法 逆置单链表
- 链表合并的递归和非递归方法
- 递归和非递归方法建立二叉树
- 递归和非递归方法打印螺旋矩阵
- 归并排序的递归和非递归方法总结
- 归并排序数组实现之递归和非递归方法
- 归并排序的递归和非递归实现方法
- 复习篇 -- 递归和非递归方法实现N!
- 非递归和递归方法遍历二叉树
- [leetcode]爬楼梯的递归和非递归方法
- 二叉树的遍历 -- 递归和非递归方法
- 二叉树基本操作递归和非递归方法
- 二叉树遍历,递归和非递归方法
- 快速排序的递归和非递归实现方法
- 如何将数据库中表转化到redis中
- NOIP2017成绩(普及T1)
- 度度熊与邪恶大魔王(dp)
- iOS多线程总结
- 从一道面试题来认识java类加载时机与过程
- 汉诺塔递归方法和非递归方法
- Android系统启动流程分析(一)
- Azure 中 Windows 虚拟机的大小
- 计算题
- 通过任务管理器,alt+Ctrl+delete,杀掉某个死机的plsql,但是plsql我开了多个,不知道死机的对应哪一个怎么办?
- 去知乎转了一圈看了一些话题感觉又有活力了
- 交换机的连接方式有哪些?堆叠交换机好吗?
- H.264编码原理以及I帧B帧P帧
- css好看背景色汇总