汉诺塔的非递归实现

借助堆栈以非递归(循环)方式求解汉诺塔的问题(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
#include <bits/stdc++.h>
using namespace std;

struct Frame {
    int n;
    char a,b,c;
    int state;
};

int main() {
    int N;
    cin >> N;
    stack<Frame> st;
    st.push({N,'a','b','c',0});
    while (!st.empty()) {
        Frame& f = st.top();
        if (f.n == 1) {
            cout<<f.a<<" -> "<<f.c<<'\n';
            st.pop();
        } else {
            if (f.state == 0) {
                f.state=1;
                st.push({f.n-1,f.a,f.c,f.b,0});
            } else if (f.state == 1) {
                f.state=2;
                cout<<f.a<<" -> "<<f.c<<'\n';
                st.push({f.n-1,f.b,f.a,f.c,0});
            } else {
                st.pop();
            }
        }
    }
    return 0;
}
分类: DS-Algo 标签: C++

评论

暂无评论数据

暂无评论数据

目录