经典的汉诺塔问题经常作为一个递归的经典例题存在。可能有人并不知道汉诺塔问题的典故。汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一回只能移动一个圆盘。有预言说,这件事完成时宇宙会在一瞬间闪电式毁灭。也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。恩,当然这个传说并不可信,如今汉诺塔更多的是作为一个玩具存在。Gardon就收到了一个汉诺塔玩具作为生日礼物。 
  Gardon是个怕麻烦的人(恩,就是爱偷懒的人),很显然将64个圆盘逐一搬动直到所有的盘子都到达第三个柱子上很困难,所以Gardon决定作个小弊,他又找来了一根一模一样的柱子,通过这个柱子来更快的把所有的盘子移到第三个柱子上。下面的问题就是:当Gardon在一次游戏中使用了N个盘子时,他需要多少次移动才能把他们都移到第三个柱子上?很显然,在没有第四个柱子时,问题的解是2^N-1,但现在有了这个柱子的帮助,又该是多少呢? 

Input包含多组数据,每个数据一行,是盘子的数目N(1<=N<=64)。 
Output对于每组数据,输出一个数,到达目标需要的最少的移动数。 
Sample Input

1
3
12

Sample Output

1
5
81
变体汉诺塔
    问题描述:在经典汉诺塔的基础上加一个条件,即,如果再加一根柱子(即现在有四根柱子a,b,c,d),计算将n个盘从第一根柱子(a)全部移到最后一根柱子(d)上所需的最少步数,当然,也不能够出现大的盘子放在小的盘子上面。注:1<=n<=64;
分析:设F[n]为所求的最小步数,显然,当n=1时,F[n]=1;当n=2时,F[n]=3;如同经典汉诺塔一样,我们将移完盘子的任务分为三步:
(1)将x(1<=x<=n)个盘从a柱依靠b,d柱移到c柱,这个过程需要的步数为F[x];
(2)将a柱上剩下的n-x个盘依靠b柱移到d柱(注:此时不能够依靠c柱,因为c柱上的所有盘都比a柱上的盘小)
     些时移动方式相当于是一个经典汉诺塔,即这个过程需要的步数为2^(n-x)-1(证明见再议汉诺塔一);
(3)将c柱上的x个盘依靠a,b柱移到d柱上,这个过程需要的步数为F[x];
第(3)步结束后任务完成。
故完成任务所需要的总的步数F[n]=F[x]+2^(n-x)-1+F[x]=2*F[x]+2^(n-x)-1;但这还没有达到要求,题目中要求的是求最少的步数,易知上式,随着x的不同取值,对于同一个n,也会得出不同的F[n]。即实际该问题的答案应该min{2*F[x]+2^(n-x)-1},其中1<=x<=n;在用高级语言实现该算法的过程中,我们可以用循环的方式,遍历x的各个取值,并用一个标记变量min记录x的各个取值中F[n]的最小值。
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 const int INF=99999999;
 7 int f[65];
 8 void Init(){
 9     f[1]=1; f[2]=3;
10     for(int i=3;i<65;i++){
11         int minx=INF;
12         for(int x=1;x<i;x++)
13             if(2*f[x]+pow(2,i-x)-1<minx)
14                 minx=2*f[x]+pow(2,i-x)-1;
15         f[i]=minx;
16     }
17 }
18 int main(){
19     int n;
20     Init();
21     while(~scanf("%d",&n)){
22         printf("%d\n",f[n]);
23     }
24     return 0;
25 }

转载于:https://www.cnblogs.com/shixinzei/p/7295089.html

HDU 1207 汉诺塔II (递推)相关推荐

  1. hdu 2064汉诺塔III 递推

    汉诺塔递推题,比汉诺塔多了一个限制条件,盘子只允许在相邻的柱子之间移动. 分析: 第1步:初始状态: 第2步:把上面的n-1个盘移到第3号杆上: 第3步:把第n个盘从1移到2: 第4步:把前n-1个从 ...

  2. hdu 1207 汉诺塔II (四柱汉诺塔)

    思路是借鉴网上一大牛的,写的很完美了,所以一句没改,代码是自己敲的,C语言版 变体汉诺塔 问题描述:在经典汉诺塔的基础上加一个条件,即,如果再加一根柱子(即现在有四根柱子a,b,c,d),计算将n个盘 ...

  3. [HDU 1207] 汉诺塔II (四柱汉诺塔)

    描述 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆 ...

  4. 《算法竞赛进阶指南》打卡-基本算法-AcWing 96. 奇怪的汉诺塔:递推

    文章目录 题目解答 题目链接 题目解答 来源:acwing 分析: 本题的汉诺塔问题是n个盘子4个塔,最基本的汉诺塔是n个盘子3个塔.本题是要在后者的基础上来做. 设d[i]表示i盘3塔问题的最小移动 ...

  5. 96. 奇怪的汉诺塔【递推】

    这是一道很经典的问题. 先看3个塔的情况 需要注意的是,这里的汉诺塔移动并无只可以移动到相邻塔的需求.即可以直接从A移到C. 设d[i]表示将i个盘子从这里移到其他除它之外塔的步数 ,总塔的数量为3 ...

  6. 汉诺塔VII(递推,模拟)

    汉诺塔VII Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...

  7. 四柱子汉诺塔—递归—递推

    三塔:递推式:d[n] = 2 * d[n-1] + 1 即把前n-1个盘子从A柱移到B柱,然后把A柱上剩的那一个盘子移动到C柱,最后把B柱上的那n-1个盘子移动到C柱上 四塔:递推式:f[n] = ...

  8. 【递推】HDU1207汉诺塔II 【汉诺塔及汉诺塔变形 归纳】

    汉诺塔问题 设f(n)为移动n层的汉诺塔的解,则整个过程其实分为三步: 把n-1层移到第二个上面去(花费f(n-1)) 把最大的移到第三个柱子上面去(花费1) 把n-1层移动到第三个柱子上去(花费f( ...

  9. 汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI、汉诺塔VII

    汉诺塔II:(hdu1207) /先说汉若塔I(经典汉若塔问题),有三塔,A塔从小到大从上至下放有N个盘子,现在要搬到目标C上, 规则小的必需放在大的上面,每次搬一个,求最小步数.这个问题简单,DP: ...

最新文章

  1. 百度李彦宏:人工智能是万物命脉
  2. python获取文件的大小_python获取文件大小
  3. android项目编码规范,Android 项目规范
  4. php如何编造简历,在简历里编造内容需要注意哪些问题?
  5. 一步一步学习Servlet之Session使用
  6. 【剑指offer】链表中环的入口
  7. [导入][ASP.NET 控件实作 Day14] 继承 CompositeControl 实作 Toolbar 控件
  8. TCP Timestamp选项
  9. Git 之 多人协同开发工作流
  10. idea项目列表名称与项目名称不一致
  11. transferwise怎么提现_境外收款和汇款工具推荐:TransferWise 可提现美元到国内
  12. 好嗨游戏:TapTap9.9分,《鸡你太美》这到底是什么魔鬼游戏?
  13. 【前端学习笔记—canvas标签和使用canvas画哆啦A梦案例】
  14. dhcp应该开启还是关闭(dhcp应该开启还是关闭)
  15. 国际短信平台接口调用的方法步骤,简单5步快速教程
  16. python语言是编译型语言-解释型语言与编译型语言
  17. QTextEdit和QTextDocument(一)
  18. StatsD 五种类型数据发送形式拟测试
  19. 手机浏览器能接收彩信,还hold住吗?
  20. Strongly Connected Tournament

热门文章

  1. 三维点云学习(4)5-DBSCNA python 复现-2-kd-_tree加速
  2. 【前端 · 面试 】HTTP 总结(二)—— HTTP 消息
  3. maven安装以及常用配置,idea如何配置maven
  4. ireport导出pdf后中文字符全部不显示(已解决)
  5. ORA-01078: failure in processing system parameters
  6. 数据库建表设计规范及原则
  7. 数学之美-隐含马尔可夫模型-笔记
  8. python range倒序_Python算法学习之堆和堆排序
  9. esri-leaflet入门教程(3)-自定义底图
  10. android gps转换度分秒,如何将GPS数据转换为度分秒