HDU2064 汉诺塔III
很郁闷,以前会做的汉诺塔问题居然一开始没想出来,好记性不如烂笔头,今日把这道题目记下来,方便以后查阅
( ・◡・)
这道题目和经典汉诺塔问题还不太一样,原题链接在此:HDU2064 不过题目再怎么变,思路还是一样的。
汉诺塔问题重点在于找到递推式,分析思路即模拟搬圆盘的过程,设step[i]为搬动第i个圆盘需要的最小步数。思路如下:
- 首先将 i-1 个圆盘移动到最右边柱子上
- 然后第 i 个圆盘移到中间
- 前 i-1 个圆盘再移动到最左边的柱子上
- 第 i 圆盘移动到最右边柱子上
- 最后将i-1个圆盘移动到最右边的柱子上
由上述过程可得递推式:
step[i]=step[i-1]+1+step[i-1]+1+step[i-1]=3step[i-1]+2
实现代码
#include<cstdio>
using namespace std;
int main(){
int n,i;
long long step[35];
step[0]=2;
for(i=1;i<35;i++){
step[i]=3*step[i-1]+2;
}
while(scanf("%d",&n)!=EOF){
printf("%lld\n",step[n-1]);
}
return 0;
}