NOIP2007Hanoi双塔问题

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;
}
发布了19 篇原创文章 · 获赞 16 · 访问量 657

猜你喜欢

转载自blog.csdn.net/user_qym/article/details/104082940