汉诺塔问题(C语言实现)

在这里插入图片描述
请添加图片描述

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️
💥个人主页:🔥🔥🔥大魔王🔥🔥🔥
💥所属专栏:🔥魔王的修炼之路–C语言🔥
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞👍和关注💖,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。


一、前言

汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

二、思路

这是一个经典的递归问题,学递归的时候一般都会引入这个问题。
我们先自己想出圆盘数为1、2、3时的情况:
1个的话:直接从a移动到c
2个的话,我们需要需要借助b柱,第一步:将上面的移动到b柱,第二部:将下面的移动到c柱,第三步:再让b柱上那个借助a柱移动到c柱,也就是需要三步。
3个的话,这个的递归思想就比较容易发现了,首先将上面的两个(也就是n-1个)看作一个整体,就相当于上面的2个圆盘的情况了,(对应着上面的理解)不过这个的第一步和第三步都是移动的两个圆盘,所以不能直接移动,又把两个的分为一个加一个,如下图请添加图片描述

更多的话类比就ok,都是一样的。

三、代码实现

//汉诺塔
#include <stdio.h>

void move(char a, char c)
{
	printf("%c->%c\n", a, c);
}
void Hanoi(int n,char a,char b,char c)
{
	if (n == 1)  //如果递归拆解到n=1,那么就直接从原位置移动到目标位置。
		move(a, c);
	else  //如果n>1,还是要继续递归,因为一次只能移动一个圆盘,而且也要符合要求(小的在大的上面)
	{
		Hanoi(n - 1,a,c,b);  //将n-1个移动到辅助位置
		move(a, c);  //将最后一个移动到目标位置
		Hanoi(n - 1, b, a, c);  //将移动到辅助位置的这些再移动到目标位置
	}
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	Hanoi(n,'A','B','C');
	return 0;
}

四、总结

  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

🌈专栏推荐
😈魔王的修炼之路–C语言
😈魔王的修炼之路–数据结构
😈魔王的修炼之路–C++
😈魔王的修炼之路–QT
😈魔王的修炼之路–算法
😈魔王的修炼之路–力扣
😈魔王的修炼之路–牛客
😈魔王的修炼之路–剑指offer
😈魔王的修炼之路–Linux
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。

请添加图片描述

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大魔王(已黑化)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值