数据结构作业题:汉诺塔的非递归实现
汉诺塔的非递归实现
借助堆栈以非递归(循环)方式求解汉诺塔的问题(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;
}
版权申明
本文系作者 @xiin 原创发布在To Future$站点。未经许可,禁止转载。
暂无评论数据