汉诺塔思路简述与代码实现 (输入圆盘数量输出操作次数版)

对于n个圆盘,进行一轮如下操作:

0.视上面n-1个圆盘为一个整体

1.将该整体移动到这样一个柱上:非最终目标柱 && 非该整体当前所在柱

2.将最底下的那个圆盘移动到最终目标柱上

3.将该整体移动到最终目标柱上

对于以上的1.3.操作中的任何一个,如果该次操作的整体,圆盘数量不为1

则直接先对该整体再进行一轮操作

如果该次操作的整体,圆盘数量为1,则该次操作正常结束,不用再执行

代码实现:

#include <stdio.h>
int f(int l, int r)
//l是该轮操作最上面圆盘的序号,r是最下面的
//想求较大圆盘数的操作次数,要用long long或更高精度
{
	if (l == r)//l==r说明该次移动只有一个圆盘
	{
		if (!l)//l==0,说明只需要移动最上面的圆盘,直接返回1
			return 1;
		else//l!=0,说明该轮操作需要移动该轮最下面的圆盘到目标柱上,这是一次操作 > 1
			//然后再把之前视为整体的n-1个圆盘整体移动到刚才那个圆盘上 > f(0,r-1)
			return 1 + f(0, r - 1);
	}
	else//l!=r,说明该轮操作有多个圆盘,将它们分成两部分 > f(l,r-1) 和 f(r,r)
		//前者是n-1的那个整体,后者是该轮最底下那个圆盘
		return f(l, r - 1) + f(r, r);
}
int main()
{
	int n;
	scanf("%d", &n);
	printf("%d", f(0, n - 1));
	return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值