P1096 [NOIP 2007 普及组] Hanoi 双塔问题
题目描述
给定 A、B、C 三根足够长的细柱,在 A 柱上放有 2n2n2n 个中间有孔的圆盘,共有 nnn 个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为 n=3n=3n=3 的情形)。

现要将这些圆盘移到 C 柱上,在移动过程中可放在 B 柱上暂存。要求:
- 每次只能移动一个圆盘;
- A、B、C 三根细柱上的圆盘都要保持上小下大的顺序。
任务:设 AnA_nAn 为 2n2n2n 个圆盘完成上述任务所需的最少移动次数,对于输入的 nnn,输出 AnA_nAn。
输入格式
一个正整数 nnn,表示在 A 柱上放有 2n2n2n 个圆盘。
输出格式
一个正整数, 为完成上述任务所需的最少移动次数 AnA_nAn。
输入输出样例 #1
输入 #1
1
输出 #1
2
输入输出样例 #2
输入 #2
2
输出 #2
6
说明/提示
限制
- 对于 50%50\%50% 的数据,1≤n≤251 \le n \le 251≤n≤25;
- 对于 100%100\%100% 的数据,1≤n≤2001 \le n \le 2001≤n≤200。
提示
设法建立 AnA_nAn 与 An−1A_{n-1}An−1 的递推关系式。
C++实现
#include
using namespace std;
int l,n;
int a[201],b[201];
void gjc(){
int t=0;
for (int j=200;j>0;j–) {
l=b[j]*2+t;
b[j]=l%10;
t=l/10;
}
}
void gjj(){
int t=0;
for (int j=200;j>0;j–) {
l=a[j]+b[j]+t;
a[j]=l%10;
t=l/10;
}
}
int main(){
scanf("%d",&n);
b[200]=1;
for (int i=1;i<=n;i++)
{gjc();gjj();}
int k=1;
while (a[k]==0&&k<200)
k++;
for (int i=k;i<=200;i++)
printf("%d",a[i]);
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥P1096 NOIP 2007 普及组 Hanoi 双塔问题&spm=1001.2101.3001.5002&articleId=146127234&d=1&t=3&u=87c84eb2d878409cb03ab74b3b77ef4b)
604

被折叠的 条评论
为什么被折叠?



