标签:6797 jzoj 圆盘 day2 hanoi add 挪到 柱子 盘子
Description
你对经典的hanoi塔问题一定已经很熟悉了。有三根柱子,n个大小不一的圆盘,要求大盘不能压在小盘上,初始时n个圆盘都在第一根柱子上,最少要多少步才能挪到最后一根柱子上?
现在我们来将hanoi塔扩展一下,由三根柱子扩展到四根柱子,其余规则不变。例如,3个圆盘,四根柱子A到D,初始时圆盘都A柱上,我们用五步就可以将圆盘都挪到D柱上:
第一步:将圆盘1从A挪到B;
第二步:将圆盘2从A挪到C;
第三步:将圆盘3从A挪到D;
第四步:将圆盘2从C挪到D;
第五步:将圆盘1从B挪到D。
你的任务是写一个程序求解四柱子hanoi塔问题最少要多少步可以解决。
Input
输入只有一行,为一个正整数n。(1<=n<=1000)
Output
输出为一个正整数,代表n盘四柱子hanoi塔问题最少要多少步可以解决。
Solution
在做经典汉诺塔问题的时候,我们是用递推求出n个盘子时的步数的,我们做这道题的时候也就类比,尝试是否能够递推解决问题
以下是前10个数的表
盘子数 | 步数 |
---|---|
1 | 1 |
2 | 3 |
3 | 5 |
4 | 9 |
5 | 13 |
6 | 17 |
7 | 25 |
8 | 33 |
9 | 41 |
10 | 49 |
... | ... |
观察上面的表格,我们发现,从1个盘子到2个盘子与2个到3个各增加了2步即\(2^{1}\)步;从3个到4个、从4个到5个与从5个到6个各增加了4步即\(2^{2}\)步,以此类推,我们做出猜想
\[f_{i}=f_{i-1}+2^{k} \]其中\(k \in N^{*}\)且是递增的
对于\(2^{k}\)会加(k+1)次
数据\(n \leqslant 1000\)所以直接递推就好
#include <cstdio>
#include <algorithm>
#define open(x) freopen(x".in","r",stdin);freopen(x".out","w",stdout);
using namespace std;
int n,cnt,num,i;
long long add,f[1001];
int main()
{
open("hanoi");
scanf("%d",&n);
f[1]=1;f[2]=3;f[3]=5;
add=4;cnt=3;num=3;
for (i=4;i<=n;i++)
{
f[i]=f[i-1]+add;
cnt--;
if (!cnt) cnt=++num,add*=2;
}
printf("%lld",f[n]);
return 0;
}
标签:6797,jzoj,圆盘,day2,hanoi,add,挪到,柱子,盘子 来源: https://www.cnblogs.com/Sport-river/p/13658285.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。