博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汉诺塔2(四个柱)
阅读量:6333 次
发布时间:2019-06-22

本文共 1184 字,大约阅读时间需要 3 分钟。

Problem Description
经典的汉诺塔问题经常作为一个递归的经典例题存在。可能有人并不知道汉诺塔问题的典故。汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着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
 

 

Author
Gardon
 

 

Source
//动态规划,转移是g[n]=min{g[n-k]+g[n-k]+f[k]}(1<=k
f[n]=2^n-1;#include
#include
int main(){ int n,i,k; double f[66],g[66]; f[1]=2.0; for(i=2;i<=64;i++)f[i]=f[i-1]*2.0; for(i=1;i<=64;i++)f[i]-=1.0; g[1]=1; for(i=2;i<=64;i++) { g[i]=g[i-1]*2+f[1]; for(k=2;k
tmp)g[i]=tmp; } } while(scanf("%d",&n)!=EOF) { printf("%.0lf\n",g[n]); } return 0;}

  

转载于:https://www.cnblogs.com/zzzzw/p/4447001.html

你可能感兴趣的文章
本文摘录 - FlumeJava
查看>>
Scala学习(三)----数组相关操作
查看>>
Matlab基于学习------------------函数微分学
查看>>
Dundas 系列
查看>>
Windows的命令行查看,修改,删除,添加环境变量
查看>>
iOS 图文混排
查看>>
64. Minimum Path Sum
查看>>
Windows Live Writer 使用指南
查看>>
分析iOS Crash文件,使用命令符号化iOS Crash文件
查看>>
R学习笔记 第五篇:字符串操作
查看>>
在Mac OS下配置PHP开发环境
查看>>
(转)介绍下Nuget在传统Asp.net项目中的使用
查看>>
C# ArcEngine 实现点击要素高亮并弹出其属性
查看>>
初识GO语言——安装Go语言
查看>>
SDK命令行操作
查看>>
基于Bootstrap的DropDownList的JQuery组件的完善版
查看>>
EXTJS学习系列提高篇:第二十四篇(转载)作者殷良胜,ext2.2打造全新功能grid系列--阅增删改篇...
查看>>
Hadoop MapReduce编程 API入门系列之分区和合并(十四)
查看>>
判断二叉树是否平衡、是否完全二叉树、是否二叉排序树
查看>>
并查集的应用之求解无向图中的连接分量个数
查看>>