用了递归以外的方法做了一下汉诺塔,特此水一贴
  • 板块灌水区
  • 楼主NiII_CMeNOH_2
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/4 14:09
  • 上次更新2024/12/4 19:28:50
查看原帖
用了递归以外的方法做了一下汉诺塔,特此水一贴
90347
NiII_CMeNOH_2楼主2024/12/4 14:09

前些时候听说一切递归都可以转化成栈+循环,于是(在沉迷雀魂之余)(挑了节水课)看了看怎么用循环写汉诺塔

这大概不构成题解发评论区吧(汗)

#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;
}
2024/12/4 14:09
加载中...