前些时候听说一切递归都可以转化成栈+循环,于是(在沉迷雀魂之余)(挑了节水课)看了看怎么用循环写汉诺塔
这大概不构成题解发评论区吧(汗)
#include<stdio.h>
struct move{//一个move类型的数据的意义是把层数为bot的圆环从from搬运到to的运动;
int bot;//最底部的一个
char from;//从何处来
char to;//到何处去
};
const char a='a';const char b='b';const char c='c';//手生了,代码里'a' 和a的混用太严重,遂直接定义变量
int step=1;//步数,无需解释
char rst(char from,char to){//这里意思大家应该能看懂,但是我实在不知道应该怎么把这句话整简单一点
if(from=='a'&&to=='b' ) return c;
if(from=='a'&&to=='c' ) return b;
if(from=='b'&&to=='c' ) return a;
if(from=='b'&&to=='a' ) return c;
if(from=='c'&&to=='a' ) return b;
if(from=='c'&&to=='b' ) return a;
}
inline void print(move k){//纯粹偷懒
printf("step%d:Let the %d moving from %c to %c\n",step++,k.bot,k.from,k.to);
}
int main()
{
move m[128];//静态数组模拟栈
int ptr=0;//模拟指针
bool flag=0; //flag=1表示刚刚移动了一摞圆盘,现在要把这一摞圆盘底下的圆盘移走
//scanf("%d",&m[0].bot);
m[0].bot=114514;
m[0].from=a;m[0].to=c;//把第一个元素压入栈;
while(ptr+1) {//空栈结束循环;
// getchar();//调试的遗迹
if(flag) {//见line25
flag=0;
print(m[ptr]);
m[ptr].bot--;
m[ptr].from=rst(m[ptr].from,m[ptr].to);
}
else{
if(m[ptr].bot==1){//bot=1的圆盘被移动意味着一整摞圆盘都被移完了,所以弹出栈顶元素同时令flag=1
flag=1;
print(m[ptr]);
ptr--;
}
else {//唯一需要压栈的情况
// putchar('a'); //调试时遗迹
ptr++;
m[ptr].bot=m[ptr-1].bot-1;
m[ptr].to=rst(m[ptr-1].from,m[ptr-1].to);
m[ptr].from=m[ptr-1].from;
}
}
}
return 0;
}