汉诺塔问题分析
创作时间:
作者:
@小白创作中心
汉诺塔问题分析
引用
CSDN
1.
https://blog.csdn.net/2401_83283514/article/details/137691031
汉诺塔问题是在递归学习中一个非常有意思的问题,是一道经典的智力游戏,也被称为河内塔或汉诺威塔。游戏的目的是通过一系列的移动,将一组大小不一的矩形条从一个柱子全部移动到另一个指定柱子上。我们来看一下汉诺塔游戏的规则:
- 游戏开始时,所有的矩形条全部堆叠在最左侧柱子上,并且最大的矩形条在最底侧,最小的在最顶侧。
- 玩家的目标是把这些矩形条全部移动到最右侧柱子上,同样最大的矩形条在最底侧,最小的矩形条在最顶侧。
- 在移动过程中,玩家每次只能移动一个矩形条,并且只能在三个柱子间移动。
- 移动过程中,小矩形条不能在大矩形条下面,即大矩形条必须在底部,小矩形条必须在顶部。
- 玩家不能使用额外的空间或者临时的柱子来帮助移动矩形条
完成汉诺塔问题的步骤:
- 将最顶层的矩形条从图一移动到柱子即图三上;
- 然后把图一中介于两者大小之间的矩形条移动到柱子即图二上;
- 把图三中的矩形条移动到图二上;
- 把图三中最大的矩形条移动到图三上;
- 把图二中较小的矩形条移动到图以上;
- 再把图二上剩余的一个矩形条移动到图三上;
- 最后再把图以上的矩形条移动到图三即可。
通过这个我们可以发现一个规律:有三个矩形条移动了7次即2^3-1;也就是说如果有n个矩形条的话移动了2^n-1次。
那么接下来我们就来看代码部分:
#include<stdio.h>
void move(char A,char B)
{
printf("%c->%c\n",A,B);
}
//n:矩形条的个数
//pos1:即图一所在柱子
//pos2:图二所在柱子
//pos3:图三所在柱子
void Hanio(int n,char pos1,char pos2,char pos3)
{
if(n==1)
{
move(pos1,pos3);
}
else
{
Hanio(n-1,pos1,pos3,pos2);//此时pos1是起始位置,pos3是辅助位置,pos2是目标位置
move(pos1,pos3);//这个时候图一所在位置仅剩下一个矩形条,移动到目标柱子图三即可
Hanio(n-1,pos2,pos1,pos3);//此时pos2是起始位置,pos1是辅助位置,pos3是目标位置
}//用到了递归的思想
}
int main()
{
int n=0;
scanf("%d",&n);
Hanio(n,'a','b','c');
return 0;
}
汉诺塔游戏关键在于策略和逻辑思维,并把一个实际问题转化为代码的能力。这至关重要,对函数学习中递归的思想起到了很大的帮助,更加突出递归的魅力:把一个复杂的问题转化为一串逻辑简单的代码。通过解决汉诺塔问题,我们可以自己的问题解决能力和策略规划能力。
相信大家都一定会有所收获!
热门推荐
化学考试必考:硅酸根的sp3杂化
冬季养生全攻略:科学饮水+食疗方案
冬季心理调适:六大技巧助你温暖过冬
微信账号出问题?客服电话来帮忙!
6首小众的爱情诗词,每首都有一个千古名句,读罢令人向往爱情
电脑经常出现故障怎么办?全方位排查硬件、软件、病毒等潜在问题
小米手机维修全攻略:从诊断到取机的六大步骤
衰老心理学:心态如何影响衰老
碳酸根的结构之谜:路易斯理论 vs 大派键
碳酸氢根离子:维持身体酸碱平衡的关键物质
中考物理:参照物解题技巧大揭秘!
《疯狂的麦咭》第九季:虚拟现实技术加持下的明星亲子闯关新体验
《疯狂麦咭》:一场别开生面的亲子闯关之旅
《疯狂麦咭》:从传统闯关到虚拟现实,这档儿童节目为何能长盛不衰?
研究证实:这样运动,真能抗衰老!
南昌必打卡!这些地道美食你都吃过吗?
凤凰沟冬日游玩攻略:南昌人的周末好去处
吃开封菜(不是某fc),至少得准备两个胃
揭秘上海世博会英国馆:亚克力材料的魔法
亚克力:从“有机玻璃”到环保先锋
扩大WiFi覆盖范围:无线中继(WDS)设置详解
雾霾围城下的一线交警:健康隐患与防护之道
揭秘交警快速反应:技术与制度双轮驱动的交通管理新模式
跟着李晨沙溢探秘黄河沿线美景
李晨带队《奔跑吧·黄河篇》:创新演绎黄河文化传承
《奔跑吧·黄河篇》:创新演绎黄河生态保护新篇
原硅酸根:一个四面体的化学传奇
随身WiFi选购指南,2025年随身WiFi还值得买吗?
高温天用凉席,这些误区你踩了吗?
竹凉席&冰丝凉席:夏季清洁小妙招