0
已解决
张舒斌
中级光能
中级光能
3332 又是汉诺塔
题目描述 Description
汉诺塔问题相信大家已经很熟悉了。现要将这些圆盘移到C柱上,在移动过程中可放在B柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2)A、B、C三根细柱上的圆盘都要保持上小下大的顺序;
现在假设A柱上有2*n个圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形)。
现在希望你写一个程序,计算出2*n个圆盘完成上述任务所需的最少移动次数。
输入描述 Input Description
一个正整数n,表示A柱上放有2n个圆盘。
输出描述 Output Description
一个正整数, 为完成上述任务所需的最少移动次数。
样例输入 Sample Input
输入样例1
1
输入样例2
2
样例输出 Sample Output
输出样例1
2
输出样例2
6
数据范围及提示 Data Size & Hint
对于50%的数据,1≤n≤25
对于100%的数据,1≤n≤200
奉上本菜鸟超超超超时程序:
#include <iostream>
using namespace std;
long long count=0;
void hanoi(int n,char a,char c,char b)
{
if(n==1)
{
count++;
return ;
}
hanoi(n-1,a,b,c);
{
count++;
}
hanoi(n-1,c,a,b);
}
int main()
{
int n;
cin>>n;
hanoi(n,'A','C','B');
cout<<count*2;
return 0;
}
0
已采纳
杨陈卓
新手天翼
新手天翼
首先,递归本来就容易超时,应该用套公式
其次得用高精度,因为最大可达2的201次方
现在奉上正解:
高精度:
循环(i从1到n+1)
{
循环(j从1到l)
a[j]乘2
循环(j从1到l)
{
s赋值0;
如果(a[j]大于9)
{
a[j+1]+=a[j]/10;
a[j]%=10;//核心部分!!
s=max(s,j+1);
}
}
l=max(l,s);
}
最后还需判断一下:
如果a[1]大于等与2
a[1]-2后从l一直循环到1,输出。
否则a[2]=a[1]+a[2]-2;
从l一直循环到2,输出。
0
0