打卡信奥刷题(926)用C++实现信奥P1096 [NOIP 2007 普及组] Hanoi 双塔问题

P1096 [NOIP 2007 普及组] Hanoi 双塔问题

题目描述

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

现要将这些圆盘移到 C 柱上,在移动过程中可放在 B 柱上暂存。要求:

  1. 每次只能移动一个圆盘;
  2. A、B、C 三根细柱上的圆盘都要保持上小下大的顺序。

任务:设 AnA_nAn2n2n2n 个圆盘完成上述任务所需的最少移动次数,对于输入的 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 251n25
  • 对于 100%100\%100% 的数据,1≤n≤2001 \le n \le 2001n200

提示

设法建立 AnA_nAnAn−1A_{n-1}An1 的递推关系式。

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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值