题目描述
给定AA、BB、CC三根足够长的细柱,在AA柱上放有2n2n个中间有孔的圆盘,共有nn个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3n=3的情形)。
现要将这些圆盘移到CC柱上,在移动过程中可放在BB柱上暂存。要求:
(1)每次只能移动一个圆盘;
(2)AA、BB、CC三根细柱上的圆盘都要保持上小下大的顺序;
任务:设A_nAn为2n2n个圆盘完成上述任务所需的最少移动次数,对于输入的nn,输出A_nAn。
输入输出格式
输入格式:
一个正整数nn,表示在AA柱上放有2n2n个圆盘。
输出格式:
一个正整数, 为完成上述任务所需的最少移动次数A_nAn。
输入输出样例
说明
【限制】
对于50\%50%的数据,1 \le n \le 251≤n≤25
对于100\%100%的数据,1 \le n \le 2001≤n≤200
【提示】
设法建立A_nAn与A_{n-1}An−1的递推关系式。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
int n,a[610],where=610;
int main(){
a[1]=1;
scanf("%d",&n);
for(int i=2;i<=n;i++){
for(int k=1;k<=i-1;k++){
a[k]*=2;
}
for(int k=1;k<=i-1;k++){
if(a[k]>=10){
a[k]-=10;
a[k+1]++;
}
}
a[1]++;
}
for(int k=1;k<=690;k++){
a[k]*=2;
}
for(int k=1;k<=690;k++){
if(a[k]>=10){
a[k]-=10;
a[k+1]++;
}
}
while(a[where]==0){
where--;
}
for(int i=where;i>=1;i--){
printf("%d",a[i]);
}
return 0;
}