借助堆栈以非递归(循环)方式求解汉诺塔的问题(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;
typedef struct{
int from,to,num;
}op;
int main(){
stack<op> S;
int n;
cin>>n;
S.push({0,2,n});
while(!S.empty()){
op O=S.top();
S.pop();
if(O.num==1){
printf("%c -> %c\n",'a'+O.from,'a'+O.to);
}else{
int help=0^1^2^O.from^O.to; //找出中间借助移动的盘
S.push({help,O.to,O.num-1});
S.push({O.from,O.to,1});
S.push({O.from,help,O.num-1});
}
}
return 0;
}