汉诺塔的非递归实现
借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为“a”)通过借助柱(标记为“b”)移动到目标柱(标记为“c”),并保证每个移动符合汉诺塔问题的要求。
输入格式:
输入为一个正整数N,即起始柱上的盘数。
输出格式:
每个操作(移动)占一行,按柱1 -> 柱2的格式输出。
#include <bits/stdc++.h>
using namespace std;
char name[3]={'a','b','c'};
stack<int> s[3];
void move(int a,int b)
{
if(s[a].empty()&&!s[b].empty()||(!s[a].empty()&&!s[b].empty()&&s[a].top()>s[b].top()))
{
s[a].push(s[b].top());
s[b].pop();
printf("%c -> %c\n",name[b],name[a]);
return;
}
else if(!s[a].empty()&&s[b].empty()||(!s[a].empty()&&!s[b].empty()&&s[a].top()<s[b].top()))
{
s[b].push(s[a].top());
s[a].pop();
printf("%c -> %c\n",name[a],name[b]);
return;
}
}
int main()
{
int N;
scanf("%d",&N);
for(int i=N;i>0;i--)
s[0].push(i);
int a1,a2,a3;
a2=0;
a3=1;
if(N%2!=0)
{
name[1]='c';
name[2]='b';
}
while(1)
{
move(a2,a3);
if(s[a3].size()==N)
break;
a1=a2;
a2=a3;
a3=(a2+1)%3;
move(a1,a3);
}
}