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] = 2f[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;
}
如有侵权可以联系我