文章标题
来源:互联网 发布:喜剧网络剧他大舅 编辑:程序博客网 时间:2024/06/08 07:19
https://biancheng.love/problem/719/index
汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘。有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。恩,当然这个传说并不可信。
ModricWang想让这个游戏更有趣一些,规定所有的圆盘只能在相邻的柱子间移动。规定三根柱子为A、B、C,请输出所有的n个盘子从A移动到C的步骤。
汉诺塔问题一般采用递归方法实现,递归函数的调用使用栈的调度机制进行工作,故本题可采用定义栈这个结构模拟递归调用过程,需要明确栈的调度规则,先进后出(FILO),具体实现见代码
#include <iostream>using namespace std;//定义栈结构typedef struct hanoi{ int n; char a,b,c;}han;han h[100000];int top;//初始化栈void Init(){ top=-1;}//判断栈是否为空bool Empty(){ return top==-1;}//入栈void Push(int n,char a,char b,char c){ top++; h[top].n=n; h[top].a=a; h[top].b=b; h[top].c=c;}//出栈void Pop(){ top--;}//返回栈顶void GetTop(han&s){ s.n=h[top].n; s.a=h[top].a; s.b=h[top].b; s.c=h[top].c;}//主函数int main(int argc, char const *argv[]){ int n; scanf("%d",&n);if(n==0){cout<<'\n';return 0;} Init(); Push(n,'A','B','C'); while(!Empty()) { han q; GetTop(q); Pop(); if(q.n==1&&q.a=='0') { cout<<q.b<<" --> "<<q.c<<'\n'; } else if(q.n==1&&q.c=='0') { cout<<q.a<<" --> "<<q.b<<'\n'; } else if (q.n==1&&q.a!='0'&&q.c!='0') { cout<<q.a<<" --> "<<q.b<<'\n'; cout<<q.b<<" --> "<<q.c<<'\n'; /* code */ } else{ Push(q.n-1,q.a,q.b,q.c); Push(1,'0',q.b,q.c); Push(q.n-1,q.c,q.b,q.a); Push(1,q.a,q.b,'0'); Push(q.n-1,q.a,q.b,q.c); } } return 0;}
本题push步骤即为将原来递归步骤改写(倒过来即可,注意n=1时分类讨论的情况)
Hanoi(n-1,a,b,c);printf("%c --> %c\n",a,b);Hanoi(n-1,c,b,a);printf("%c --> %c\n",b,c);Hanoi(n-1,a,b,c);
0 0
- 文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题 文章标题 文章标题 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- 文章标题
- java向上转型和向下转型
- 第6章 6.2 在代码段中使用栈
- I【Mweb训练作业】 select 组件
- 三十一 Swift3.0之 析构方法
- QQ影音播放MP4、MKV等视频文件有声音没图像,显示绿屏
- 文章标题
- 极限与复合极限的四则运算
- IMWeb第二次作业——Vue.js的select组件
- python tornado 操作 mysql
- 彻底根除“无法安装64位版本的Office,因为在您的PC上找到了以下32位程序:”的问题
- 栈的应用
- 一款不错的Android环形进度条
- 2017年华为Fx计划在线机试题(详解)
- JAVA属性和方法的继承与隐藏、final、super、abstract