问题标题: 酷町堂:3305 汉诺塔问题

0
0
已解决
汪宇航
汪宇航
新手启示者
新手启示者

题目描述 Description

给定A,B,C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意:这两个圆盘是不加区分的。(下图为n=3的情形)。

现在需要将这些圆盘移动到C柱上,但是移动过程中需要满足以下条件:
(1) 每次只能移动一个圆盘;
(2) A,B,C三根细柱上的圆盘都要保持上小下大的顺序;

任务:设An为2n个圆盘完成上述任务所需的最少移动次数,对于输入的n,输出An。

输入描述 Input Description

一个正整数n,表示在A柱上放有2n个圆盘。

输出描述 Output Description

一个正整数, 为完成上述任务所需的最少移动次数An。

样例输入 Sample Input

【输入样例1】 1 【输入样例2】 2

样例输出 Sample Output

【输出样例1】 2 【输出样例2】 6

数据范围及提示 Data Size & Hint

对于50%的数据,1 ≤n ≤50;
对于100%的数据,1 ≤n ≤100;

提示:设法建立An与An−1的递推关系式。

 

 

结果原本看起来100%的正确率,结果输出错误......

汪宇航在2021-02-10 14:27:18追加了内容

const int MAXN=100005; int A[MAXN],B[MAXN],C[MAXN],ANS[MAXN],LEN_A,LEN_B,LEN_ANS; void Read(int *A,int &LEN){ string cur; cin>>cur; LEN=cur.length(); for(int i=0;i<LEN;i++){ A[i]=cur[i]-48; } reverse(A,A+LEN); } int main(){ Read(A,LEN_A); Read(B,LEN_B); LEN_ANS=max(LEN_A,LEN_B); for(int i=0;i<=LEN_ANS;i++){ ANS[i]=A[i]+B[i]+C[i]; if(ANS[i]>9){ C[i+1]=ANS[i]/10,ANS[i]-=10; } } while(ANS[LEN_ANS]>0){ LEN_ANS++; } for(int i=LEN_ANS-1;i>=0;i--){ cout<<ANS[i]; } return 0; }

是这样么?

(有点乱)

刚刚打错了


0
已采纳
汪恺恒
汪恺恒
中级启示者
中级启示者

因为这题数据很大,必须用高精,否则WA

递推边界  f[1]="1";    //f数组是string类型

递推式

循环2至n{
        f[i]=Plus(f[i-1],f[i-1]);
        f[i]=Plus(f[i],"1");
}

最后输出 Plus(f[n],f[n])

之后就是Plus函数了,学了高精度加法就会讲到,这里就不说了

0
汪宇航
汪宇航
新手启示者
新手启示者

if(cnt>=3){

cout<<a<<endl;

}else if(cnt==1){

cout<<" "<<a<<endl;

}else{

cout<<" "<<a<<endl;

}

高精度加法,是这样吧?

头文件就不说了

我要回答