Strange Towers of Hanoi POJ - 1958(递推)

本文详细解析了4塔汉诺塔问题的求解算法,通过对比3塔汉诺塔,介绍了递归求解最小移动步数的方法,并提供了完整的C++代码实现。

题意:就是让你求出4个塔的汉诺塔的最小移动步数,(1 <= n <= 12)

那么我们知道3个塔的汉诺塔问题的解为:d[n] = 2*d[n-1] + 1 ,可以解释为把n-1个圆盘移动到一个临时柱子上,然后将1个最大圆盘移动到目标的主子,最后再将n-1个圆盘移动到目标柱子。

为什么是n-1和1的组合呢,因为当你将n-i个圆盘移动到一个临时柱子上的时候,你会发现只靠两个柱子最多能移动1个圆盘。所以这个i=1

 

如果推到到4个柱子的汉诺塔,f[n] = min(f[n],2*f[n-i]+d[i]). (1 <= i < n),就是把n-i个圆盘移动到临时的一个柱子上,然后把剩下的 i 个圆盘在三个柱子中移动到目标柱子,最后把n-i移动会目标柱子

 1 #include<iostream>
 2 #include<string.h>
 3 #include<cstdio>
 4 using namespace std;
 5 
 6 int d[20];
 7 int f[20];
 8 int main()
 9 {
10     d[1] = 1;
11     for(int i=2;i<=12;i++)d[i] = (d[i-1]<<1)+1;
12     memset(f,0x3f,sizeof(f));
13     f[1] = 1;
14     for(int i=2;i<=12;i++)
15     {
16         for(int j=1;j<i;j++)
17         {
18             f[i] = min(f[i],(f[j]<<1)+d[i-j]);
19         }
20     }
21     for(int i=1;i<=12;i++)
22     {
23         printf("%d\n",f[i]);
24     }
25 }
View Code

 

转载于:https://www.cnblogs.com/iwannabe/p/10099212.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值