c++实现汉诺塔(图文并茂)

 闲言少叙,直接开始,题目就不多说了,大家都知道。

我们先看1个的情况

 

我们看2个的情况:

 

我们看3个的情况:

我们再来看4个的情况:

 

大家可以来找一找相似之处:

首先是移动次数,假设有N个圆盘,就需要移动2^N-1次,

 思路:我们先把所有的圆盘分成两个部分,第N个为一组,并将这一组命名为E,剩余的1~N-1为一组,并将这一组命名为F,这时候我们发现就和第二张动图的情况显示,只需要将F组移动到B柱,将E组移动到C柱,最后把F组移动到C柱,就完成了操作。然后我们的目标就是将这个F组给移动到B柱,那么我们运用递归的思想,再将第N-1个为E组,剩余的1~N-2为F组,就可以完成操作了。(这里提到的A,B,C柱就是上面动图的A,B,C柱)

操作:我们设置三个字母:X,Y,Z,X为出发点,Y为跳板,C为终点,参照第二张动图:

1.将F从A移动到B:

X---->Z---->Y

2.将E从A移动到C:

X---->Y---->Z 

3.将F从B移动到C:

Y---->X---->Z 

 最后,我们把X看作A柱,Y看作B柱,Z看作C柱

上代码:

#include<iostream>
using namespace std;
void han(int a, char x, char y, char z) {
	if (a == 1) {
		cout << x << "->" << z << endl;//剩余1个的时候直接从开始的移动到结束的
	}
	else {
		han(a - 1, x, z, y);
		cout << x << "->" << z << endl;
		han(a - 1, y, x, z);
	}
}
int main() {
	int a;
	cin >> a;
	han(a, 'a', 'b', 'c');
	return 0;
}

本人语言表达能力不是很好,有不懂的可以私信,会及时回复,谢谢大家支持! 

 

  • 20
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值