NOIP2007Hanoi双塔问题
题目描述
给定A、B、C三根足够长的细柱,在A柱上放有2n个中间有空的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。
现要将这些国盘移到C柱上,在移动过程中可放在B柱上暂存。要求:
(1) 每次只能移动一个圆盘;
(2) A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。
输入格式
一个正整数n,表示在A柱上放有2n个圆盘。
输出格式
仅一行,包含一个正整数,为完成上述任务所需的最少移动次数An。
输入样例 1
1
输出样例 1
2
输入样例 2
2
输出样例 2
6
提示
【数据规模】
对于50% 的数据,1≤n≤25 ;
对于100% 的数据,1≤n≤200 。
【提示】
设法建立An与An-1的递推关系式。
这题考察的就是如何建立An与An-1的递推关系式和高精度
An与An-1的递推关系式为:
f[n]=f[n-1]*2-2
【模板】2的n次幂
其余就是高精度了:
#include<iostream>
#include<cmath>
using namespace std;
int a[1001];
int main()
{
int i,n,j;
cin>>n;
int t=0;
a[0]=1;
for(i=1;i<=n+1;i++)//高精度求2^n
{
for(j=0;j<=n;j++)
{
a[j]=a[j]*2+t;
t=a[j]/10;
a[j]=a[j]%10;
}
}
a[0]-=2;//将算出的数-2就是答案
for(i=1000;i>=0;i--)
{
if(a[i]!=0)
break;
}//如果末尾不再是0
for(i=i;i>=0;i--)
{
cout<<a[i];
} //倒序输出答案
return 0;
}