借助堆栈以非递归(循环)方式求解汉诺塔的问题(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
额第一次写汉诺塔,虽然听强哥讲过,但是一直没试过,上来是懵逼的,所以先尝试递归方式,写对了,然后感觉非递归还是懵逼,想起之前尝试的非递归树的遍历了,反正是用栈,仔细想过之后,其实就是当成结点对待就好了,从后往前倒着来,假设前n-1个已经放好从a到b,再把剩下的一个从a到c再从b到c,只要代号不是1,就出栈,并把它的第三个和第二个操作,第一个操作入栈,如果代号是1,就输出。、
可能没表达清楚,看代码,输出都是a->c输出的,abc并非对应'a','b','c',只是方便记录。
代码:
#include <iostream> #include <map> #include <algorithm> #include <stack> using namespace std; class abc { public: int d; char a, b, c; abc(char x,char y,char z,int s): a(x),b(y),c(z),d(s){} }; void hanio(int n,char a,char b,char c) { if(n == 1) { cout<<a<<" -> "<<c<<endl; return ; } hanio(n-1,a,c,b); hanio(1,a,b,c); hanio(n-1,b,a,c); } int main() { int n; cin>>n; abc temp('a','b','c',n); stack <abc> q; temp.d = n,temp.a = 'a',temp.b = 'b',temp.c = 'c'; q.push(temp); while(!q.empty()) { temp = q.top(); q.pop(); if(temp.d == 1)printf("%c -> %c ",temp.a,temp.c); else { q.push(abc(temp.b,temp.a,temp.c,temp.d - 1)); q.push(abc(temp.a,temp.b,temp.c,1)); q.push(abc(temp.a,temp.c,temp.b,temp.d - 1)); } } // cout<<endl; // hanio(n,'a','b','c'); }