习题3.10 汉诺塔的非递归实现(25 分)浙大版《数据结构(第2版)》题目集

Posted 给杰瑞一块奶酪~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了习题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\n",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‘);
}

 

以上是关于习题3.10 汉诺塔的非递归实现(25 分)浙大版《数据结构(第2版)》题目集的主要内容,如果未能解决你的问题,请参考以下文章

7-17 汉诺塔的非递归实现 (25分)

7-17 汉诺塔的非递归实现(25 分)(有待改进)

7-17 汉诺塔的非递归实现

汉诺塔的非递归实现(借助堆栈模拟递归)

汉诺塔的非递归实现(栈)

汉诺塔的非递归算法