经典的汉诺塔问题经常作为一个递归的经典例题存在。可能有人并不知道汉诺塔问题的典故。汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着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]的最小值。
 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int INF=;
int f[];
void Init(){
f[]=; f[]=;
for(int i=;i<;i++){
int minx=INF;
for(int x=;x<i;x++)
if(*f[x]+pow(,i-x)-<minx)
minx=*f[x]+pow(,i-x)-;
f[i]=minx;
}
}
int main(){
int n;
Init();
while(~scanf("%d",&n)){
printf("%d\n",f[n]);
}
return ;
}

最新文章

  1. HTML kbd键盘元素
  2. ASIHTTPRequest中数据压缩问题与gzip
  3. OC 内存泄露 自动释放池
  4. 使用Nginx负载均衡搭建高性能.NETweb应用程序二
  5. js常用方法:
  6. linux之SQL语句简明教程---SELECT
  7. mysql查询今天、昨天、7天、近30天、本月、上一月 数据
  8. mysql之 MySQL 主从复制概述
  9. Day15 jss整体结构梳理
  10. chome(谷歌浏览器)上传文件崩溃/上传图片崩溃/打开浏览文件未响应 解决方案
  11. ThingJS平台制作第一人称视角下的巡更效果
  12. Python判断字符串是否xx开始或结尾
  13. 夏令时(DST)测试
  14. Luogu P4944 【PION贪吃蛇】
  15. MyEclipse中jquery.js文件报missing semicolon的错误解决
  16. 360手机新品牌5月6日公布 周鸿祎席地而坐谈AK47
  17. java 控制流
  18. 常用sql001_partition by 以及 row_number()和 dense_rank()和rank()区别
  19. 二、python小功能记录——监听鼠标事件
  20. windows server2012安装jdk时报错误代码1603

热门文章

  1. mysql跨库复制: replicate_wild_do_table和replicate-wild-ignore-table
  2. C# 线程池ThreadPool的用法简析
  3. python--&gt;(set /dict)交集 差集 并集 补集(功能用来做交差并补的)
  4. golang 与 c语言 之间传递指针的规则提案
  5. abap事件。
  6. System.Web.UI.Page的页面基类
  7. Tensorboard简介
  8. 海量数据找相同数,高配词,不重复的数,判断一个数是否存在,查询串,不同电话号码的个数,中位数,按照query频度排序,topk
  9. Selenium基础知识(六)下拉列表定位
  10. node.js初识06