UPC--Hanoi双塔问题

UPC–Hanoi双塔问题

关于汉诺塔问题,在此我推荐两位博客,大家有兴趣的可以去看看
高精度之Hanoi双塔问题
汉诺塔问题的扩展

题目描述:

楚继光:“防御系统还真有用,修罗王的魔法炮阵的火力果然减弱了,但好像还差一点点啊?”
墨老师:“哦,是吗,那试试双塔防御体系吧。”
如图所示,给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有空的能量圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的,图为n=3的情形。现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。每次只能移动一个圆盘,每个柱子的圆盘保持上小下大的顺序。要求输出最少移动次数。
在这里插入图片描述

输入

一个正整数,表示A柱上有2n个圆盘。

输出

仅一行,包含一个正整数,为最少移动次数。

样例输入 Copy

2

样例输出 Copy

6

提示

对于100%数据,1≤n≤200。

解题思路:递推和大数相乘
n = 1; 需要两步;
n = 2; 先将最小的两个移到B,需要两步,再将最大的两个移到C;需要两步,然后将B上面的两个移到C,需要两步;总共移到了6步,最小的移到两次每次需要两步,最大的需要一次,每次一步,22+2;
n >= 3;先将上面的n-1对圆盘移到B上面,然后将最大的一对移到C上面,以此类推,f[n] = 2
f[n-1] + 2;
版权声明:该思路原为CSDN博主「cc_wood」的原创文章,正因大佬的博文我才把这道题搞明白,再此表示感谢,附上大佬原创博文链接:https://blog.csdn.net/cccruel/article/details/69945735

AC代码

代码大部分参考于https://blog.csdn.net/cccruel/article/details/69945735,基本算是抄来的啦,不过由此学会大数相乘也是蛮不错的,嘿嘿。至于怎样推出递推公式,还有待学习,嗯,加油

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
	ll n,k=1,i,j;
	int a[200]={0};
	a[0]=2;
	cin>>n;
	if(n==1)
	{
		cout<<2;
	}
	else
	{
		for(int t=1;t<n;t++)
		{
			int x=0;
			for(i=0;i<k;i++)
			{
				a[i]=2*a[i]+x;
				if(i==0)
				{
					a[i]+=2;
				}	
				x=a[i]/10;
				a[i]%=10;		
			}
			a[k]+=x;
			if(a[k]!=0)
				k++;		
		}
		for(i=k-1;i>=0;i--)
			cout<<a[i];
	}
	return 0;
 } 

如有侵权可以联系我

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值