借助堆栈以非递归(循环)方式求解汉诺塔的问题(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 <iostream>
#include <stack>
using namespace std;
//用note来记录一件要解决的事,将n个盘子从a借助b移动到c。
struct note
{
int n;
char a;
char b;
char c;
};
//要解决的问题集合,当栈为空即全部已解决。
stack<note> st;
void Hanio(int n)
{
st.push(note{n, 'a', 'b', 'c'});//初始化,此时栈内只有一个大问题,就是n个盘子从a到c.
while(1)
{
note t = st.top();
st.pop();
//上面两行是取出栈顶问题,进行解决。
if(t.n == 1)//如果只有一个盘子,直接移动。
{
if(empty(st))
{
printf("%c -> %c\n", t.a, t.c);
break;//如果栈空,说明问题全部解决。
}
else printf("%c -> %c\n", t.a, t.c);
}
else
{
//如果n!=1,将问题分为三个小问题入栈。!!!注意入栈顺序使最先执行的在栈顶。
st.push(note{t.n - 1, t.b, t.a, t.c});
st.push(note{1, t.a, t.b, t.c});
st.push(note{t.n - 1, t.a, t.c, t.b});
}
}
}
int main()
{
int n;
cin >> n;
Hanio(n);
return 0;
}