问题标题: 酷町堂:3332 又是汉诺塔(为什么我的程序会超时?)

0
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
张舒斌
张舒斌
中级光能
中级光能

@郑怡翔 你就发一下,我就采纳你的,不然这贴永远都没人回答了

我要回答