习题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');
}
原文地址:https://www.cnblogs.com/8023spz/p/7629344.html