文章标题

来源:互联网 发布:喜剧网络剧他大舅 编辑:程序博客网 时间: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