7-11 汉诺塔的非递归实现 (25 分)
#include <iostream>
#include <stack>
#include <cstdio>
#include <map>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
int n,c=0;
cin>>n;
stack<int> H[3];
map<int,char> m;
for(int i=n; i>=1; i--)
{
H[0].push(i);
}
if(n%2==0)
{
m[0]='a';
m[1]='b';
m[2]='c';
}
else
{
m[0]='a';
m[1]='c';
m[2]='b';
}
while(1)
{
for(int i=0; i<3; i++)
{
if(!H[i].empty()&&H[i].top()==1)
{
H[i].pop();
H[(i+1)%3].push(1);
printf("%c -> %c\n",m[i],m[(i+1)%3]);
c++;
if(c==pow(2,n)-1)
{
return 0;
}
if(H[(i+2)%3].empty()||(!H[i].empty()&&H[i].top()<H[(i+2)%3].top()))
{
H[(i+2)%3].push(H[i].top());
H[i].pop();
printf("%c -> %c\n",m[i],m[(i+2)%3]);
c++;
if(c==(pow(2,n)-1))
{
return 0;
}
}
else
{
H[i].push(H[(i+2)%3].top());
H[(i+2)%3].pop();
printf("%c -> %c\n",m[(i+2)%3],m[i]);
c++;
if(c==(pow(2,n)-1))
{
return 0;
}
}
}
}
}
return 0;
}