题目描述
思路分析
平常写汉诺塔都是用递归,这里不让用,则找递归应用的是啥:堆栈
所以利用堆栈先进后出的模式来模拟递归
// #include<bits/stdc++.h>
#include<iostream>
#include<stack>
using namespace std;
struct Node{
int n,a,b,c;
Node(int m,char x,char y,char z):n(m),a(x),b(y),c(z){};
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int n;
scanf("%d",&n);
stack<Node> s; //创建存放结点的堆栈
s.push(Node(n,'a','b','c')); //先放一个初始值
while(!s.empty())
{
Node t = s.top();
s.pop();
if(t.n==1) //模拟递归,到1时结束,输出
printf("%c -> %c\n",t.a,t.c);
else{
s.push(Node(t.n-1,t.b,t.a,t.c)); //后操作的先放入
s.push(Node(1,t.a,t.b,t.c)); //单一操作的,直接出(按1处理)
s.push(Node(t.n-1,t.a,t.c,t.b)); //先操作的后放入
/*三个push,类似于当初理解递归时的过程:
将上面的所有从a放到b
再将最后一个从a放到c
再将其他的从b放到c
先进后出,所以这里三个push是倒着来的
第二个push只操作1个到目标,不用再递归,所以直接标记为1即可
*/
}
}
return 0;
}