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

借助堆栈以非递归(循环)方式求解汉诺塔的问题(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

 

 

 

非递归实现  模拟递归栈操作  大量数据不应该使用 指针&链表  也不应该使用 cout 

#include <iostream>
#include <vector>
using namespace std;
//汉诺塔问题 n a b c   n个数字 从a柱借助b柱移动到c柱
//非递归实现
class hanoiNode{
public:
    int n,a,b,c;
    hanoiNode()=default;
    hanoiNode(int n_,int a_,int b_,int c_):n{n_},a{a_},b{b_},c{c_}{}
};
void hanoi(int n,int a,int b,int c){
    vector<hanoiNode> hanoiTower(0);
    hanoiTower.push_back(hanoiNode{n,a,b,c});
    while(!hanoiTower.empty()){
        hanoiNode temp=hanoiTower.back();
        hanoiTower.pop_back();
        int n{temp.n};
        int a = {temp.a},b{temp.b} , c{temp.c};
        if(temp.n==1){
            printf("%c -> %c\n",temp.a+97,temp.c+97);
        }else{
            hanoiTower.push_back(hanoiNode(n-1,b,a,c));
            hanoiTower.push_back(hanoiNode(1,a,b,c));
            hanoiTower.push_back(hanoiNode(n-1,a,c,b));
        }
    }
}

int main(){
    int n;
    cin >> n;
    hanoi(n,0,1,2);
    return 0;
}

 

递归实现

#include <iostream>
using namespace std;
//递归实现
void hanoi(int n,char a,char b,char c){
    if(n!=1){
        hanoi(n-1,a,c,b);
        printf("%c -> %c\n"a, c);
        hanoi(n-1,b,a,c);
    }else{
       printf("%c -> %c\n",a, c);
    }
}
int main(){
    int n;
    cin >> n;
    hanoi(n,'a','b','c');
    return 0;

 

posted @ 2021-05-31 13:06  keiiha  阅读(355)  评论(0编辑  收藏  举报