C++递归解决汉诺塔问题

有n个大小不等的中空圆盘,按照从小到大的顺序叠套在立柱A上,另有两根空的立柱B和C。现在要求把全部圆盘从立柱A移动到立柱C上,移动过程中可以借助立柱B。移动时有如下要求:
(1)一次只允许移动一个盘。
(2)任何时候、任何柱子上不允许把大盘放在小盘上边。
(3)可使用任意一个立柱暂存圆盘。
请编写程序模拟把盘子从立柱A移动到立柱C上的步骤。
【输入】
一行,一个整数n(1≤n≤64),表示盘子的数目。
【输出】
若干行,表示把盘子从立柱A移动到立柱C上的步骤,格式见输出样例。

例如:

输入结果
3
A->C
A->B
C->B
A->C
B->A
B->C
A->C

楼主究极初学者,在作业平台上看到这个题苦恼了好一会儿,.....就去7K7K小游戏上连续玩了半小时的汉诺塔小游戏, 还蛮好玩的   ( 现在连小游戏网站都需要实名了  ) 打到最后一关实在蒙不出来了,被迫开始找规律.

发现要想将 第N块圆盘 从 立柱A 移到 立柱C 上,首先要将上面的 N-1块圆盘 移到 立柱B 上.
至于N-1块圆盘的移法....嗯..重新读一遍上面的话.  (把 N 换为 N-1).

然后感受到了一丝层层推进的递归感觉,..就用我半吊子的码力尝试了一下,说真的 发现规律->理清流程->代码实现->遇到问题->(摆烂)->解决问题  的感觉真的是太棒了!!

请大家一定要找机会尝试一下这种体验.

以下是我的代码 : )

#include <cstdio>
char a[]={"ABC"};
void rec(int n,char ch1,char ch2){   //n是移动圆盘数,ch1和ch3分别代表着圆盘所在立柱和目标立柱.
	int i;
	char ch3;
	if(n>1){
		for(i=0;a[i]!='\0';i++)
		if(a[i]!=ch1&&a[i]!=ch2)
		ch3=a[i];                  //找出圆盘所在立柱和目标立柱之外的第三根立柱-空闲立柱
		rec(n-1,ch1,ch3);            //将n-1块圆盘移到空闲立柱上.
		rec(1,ch1,ch2);            //将第n块圆盘移到目标立柱.
		rec(n-1,ch3,ch2);            //将n-1块圆盘移回目标立柱.
	}
	if(n==1){
		printf("%c->%c\n",ch1,ch2);     //输出!
	}
}
int main(){
	int n,i;
	scanf("%d",&n);
	rec(n,'A','C'); 
	return 0;
}

虽然才初窥编程之门,但还是忍不住得感慨程序运行的巧妙,学习编程的算法真的可以强化一个人的思维,如果让一个月前的我去玩汉诺塔,估计抓破脑袋也不会想到这种分治的思考方式,而只会一味的乱蒙吧.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值