zoukankan      html  css  js  c++  java
  • 习题3.10 汉诺塔的非递归实现(25 分)浙大版《数据结构(第2版)》题目集

    借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。

    输入格式:

    输入为一个正整数N,即起始柱上的盘数。

    输出格式:

    每个操作(移动)占一行,按柱1 -> 柱2的格式输出。

    输入样例:

    3
    

    输出样例:

    a -> c
    a -> b
    c -> b
    a -> c
    b -> a
    b -> c
    a -> c
    



    额第一次写汉诺塔,虽然听强哥讲过,但是一直没试过,上来是懵逼的,所以先尝试递归方式,写对了,然后感觉非递归还是懵逼,想起之前尝试的非递归树的遍历了,反正是用栈,仔细想过之后,其实就是当成结点对待就好了,从后往前倒着来,假设前n-1个已经放好从a到b,再把剩下的一个从a到c再从b到c,只要代号不是1,就出栈,并把它的第三个和第二个操作,第一个操作入栈,如果代号是1,就输出。、
    可能没表达清楚,看代码,输出都是a->c输出的,abc并非对应'a','b','c',只是方便记录。
    代码:


    #include <iostream>
    #include <map>
    #include <algorithm>
    #include <stack>
    
    using namespace std;
    class abc
    {
    public:
        int d;
        char a, b, c;
        abc(char x,char y,char z,int s): a(x),b(y),c(z),d(s){}
    };
    void hanio(int n,char a,char b,char c)
    {
        if(n == 1)
        {
            cout<<a<<" -> "<<c<<endl;
            return ;
        }
        hanio(n-1,a,c,b);
        hanio(1,a,b,c);
        hanio(n-1,b,a,c);
    }
    int main()
    {
        int n;
        cin>>n;
        abc temp('a','b','c',n);
        stack <abc> q;
        temp.d = n,temp.a = 'a',temp.b = 'b',temp.c = 'c';
        q.push(temp);
        while(!q.empty())
        {
            temp = q.top();
            q.pop();
            if(temp.d == 1)printf("%c -> %c
    ",temp.a,temp.c);
            else
            {
                q.push(abc(temp.b,temp.a,temp.c,temp.d - 1));
                q.push(abc(temp.a,temp.b,temp.c,1));
                q.push(abc(temp.a,temp.c,temp.b,temp.d - 1));
            }
        }
    //    cout<<endl;
    //    hanio(n,'a','b','c');
    }
  • 相关阅读:
    SpringBoot 断点调试无效问题解决
    oracle数据库入门
    IPFS入门
    Spring安全参考
    什么是内存泄漏?该如何检测?又该如何解决?
    coredump
    同一个程序在一个系统中可以跑起来,在另外一个系统上跑不起来
    dpkg 强制安装deb文件
    日志文件丢失
    文件句柄资源
  • 原文地址:https://www.cnblogs.com/8023spz/p/7629344.html
Copyright © 2011-2022 走看看