多柱汉诺塔的Frame-Stewart算法
通过分析三柱汉诺塔的递归求解过程,我们能够线性递推出移动nnn个盘子的最小移动次数
设三柱汉诺塔,移动nnn个盘子的最小移动次数为T(3,n)T(3, n)T(3,n)
T(3,n)={1n=12f(3,n−1)+1n>1T(3,n)=\left\{ \begin{aligned} & 1 & n=1 \\ & 2f(3,n-1) +1 & n > 1 \\ \end{aligned} \right. T(3,n)={12f(3,n−1)+1n=1n>1
由此可得T(3,n)=2n−1T(3,n) = 2^n - 1T(3,n)=2n−1
然而对于多柱汉诺塔问题,我们并没有一个非常直观的策略来移动圆盘。
首先考虑四柱汉诺塔的情况(又称Reve’s Puzzle),对四柱汉诺塔上移动nnn个盘子,可以通过分成如下333个步骤
- 将rrr个圆盘从AAA柱,通过CCC、DDD柱移动到BBB柱
- 将n−rn-rn−r个圆盘从AAA柱,通过CCC柱移动到DDD柱
- 将rrr个圆盘从BBB柱,通过AAA、CCC柱移动到DDD柱
那么我们的疑问是能够将111、333两个步骤作为子问题。通过一些简单的运算,我们发现对于较小的nnn,使用该方法的结果是正确的。
不加证明该递归算法的正确性,我们可以归纳递推式为
T(4,n)=min1≤r<n2T(4,n−r)+T(3,r)T(4, n) = \min_{1 \leq r < n }{2T(4, n-r) + T(3, r)} T(4,n)=1≤r<nmin2T(4,n−r)+T(3,r)
即
T(4,n)=min1≤r<n2T(4,n−r)+2r−1T(4, n) = \min_{1 \leq r < n }{2T(4, n-r) + 2^r - 1} T(4,n)=1≤r<nmin2T(4,n−r)+2r−1
产生的数列
T(4,i)=A007664=0,1,3,5,9,13,17,25,…T(4, i) = A007664 = 0, 1,3,5,9,13,17,25,\dots T(4,i)=A007664=0,1,3,5,9,13,17,25,…
对该数列进行差分,能够发现产生的数列为
A137688=1,2,2,4,4,4,8,8,8,8,⋯=20,21,21,22,22,22,…A137688 = 1,2,2,4,4,4,8,8,8,8,\dots = 2^0, 2^1, 2^1, 2^2,2^2,2^2,\dots A137688=1,2,2,4,4,4,8,8,8,8,⋯=20,21,21,22,22,22,…
因此我们可以在O(n)O(n)O(n)的时间内计算出T(4,n)T(4, n)T(4,n)的结果
对于圆柱的数量 m≥5m\geq5m≥5 的情况,我们是否可以继续使用递归的思路?
我们尝试继续使用333个步骤描述对mmm柱汉诺塔的移动方式:
- 将rrr个圆盘从AAA柱,通过m−2m-2m−2根圆柱移动到BBB柱
- 将n−rn-rn−r个圆盘从AAA柱,通过其他m−3m-3m−3根圆柱移动到mmm柱
- 将rrr个圆盘从BBB柱,通过m−2m-2m−2根圆柱移动到mmm柱
在这种移动过程中,我们会产生一些疑问,如:我们是否可以进行如下操作
- 将r’r’r’个圆盘从AAA柱,通过m−3m-3m−3根圆柱移动到BBB柱、CCC柱
- 将n−r’n-r’n−r’个圆盘从AAA柱,通过其他m−4m-4m−4根圆柱移动到mmm柱
- 将r′r'r′个圆盘从BBB柱、CCC柱,通过m−3m-3m−3根圆柱移动到mmm柱
这样的话,111、333两个步骤就难以通过递归方式描述,因为这把r’r’r’个圆盘放到了两根(甚至更多根)圆柱上
但是我们稍加考虑,假设我们移到BBB柱上的数量为rBr_BrB,本质上与我们在之前方案上先移动rBr_BrB个圆盘,再移动n−rBn-r_Bn−rB个圆盘到mmm柱上的方案是等价的。
这333个步骤已经是Frame-Stewart算法的主要思想,我们在利用公式简要地描述:
T(m,n)=min1≤r<n2T(m,n−r)+T(m−1,r)T(m,n) = \min_{1 \le r < n}2T(m,n-r)+T(m-1,r) T(m,n)=1≤r<nmin2T(m,n−r)+T(m−1,r)
对此,除m=3,4m=3,4m=3,4的情况外,我们需要O(mn2)O(mn^2)O(mn2)的时间复杂度计算mmm柱汉诺塔问题,含有nnn个圆盘时的最少移动次数。
多柱汉诺塔的Frame-Stewart算法相关推荐
- 多柱汉诺塔最优算法设计探究
多柱汉诺塔最优算法设计探究 引言 汉诺塔算法一直是算法设计科目的最具代表性的研究问题,本文关注于如何设计多柱汉诺塔最优算法的探究.最简单的汉诺塔是三个柱子(A.B.C),因此多柱汉诺塔的柱子个数M ...
- Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏
Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏 目录 输出结果 核心代码 输出结果 核心代码 def hanoi(n,x,y,z):if n==1:print(x,'--→',z) ...
- 三柱汉诺塔四柱汉诺塔
汉诺塔问题_哔哩哔哩_bilibili 三柱汉诺塔,从整体来看,分为三部 1.先让n-1个盘先由a柱放在b柱 2.把第n个盘由a柱放在c柱 3.将这n-1个盘由b柱移动到c柱 而其中的递归过程就是直到 ...
- 多柱汉诺塔问题浅析——算法及公式推导
汉诺塔问题 汉诺塔(Tower of Hanoi)是一个数学游戏:有三根柱子,其中一根柱子自底向上串着尺寸渐小的多个圆盘,遵循以下规则: 1.一次只能移动一个圆盘: 2.大圆盘不能放在小圆盘上面. 请 ...
- 四柱汉诺塔 -- 动态规划求解最优移动次数
自己用Java写了一个前台进行四柱汉诺塔的移动演示,是按照最优次序进行移动的,链接里有详细的代码实现:https://download.csdn.net/download/qq_40285036/10 ...
- hdu 1207 汉诺塔II (四柱汉诺塔)
思路是借鉴网上一大牛的,写的很完美了,所以一句没改,代码是自己敲的,C语言版 变体汉诺塔 问题描述:在经典汉诺塔的基础上加一个条件,即,如果再加一根柱子(即现在有四根柱子a,b,c,d),计算将n个盘 ...
- 时间恒久远,汉诺塔永流传(C实现经典三柱汉诺塔)
还记得猩球崛起上威尔给凯撒的那个益智汉诺塔吗?我今天就百度了一下: 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主 ...
- 多柱汉诺塔问题Hanoi 动态规划求解方案数
大家都很强,可与之共勉. 问题描述: n个盘子,m个柱子,从1号柱子移到m号柱子.满足汉诺塔的游戏规则,问最少的移动步数. 问题分析: 懒得分析了. 自己推一下,很简单的,我只想了一个小时23333 ...
- [HDU 1207] 汉诺塔II (四柱汉诺塔)
描述 经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆 ...
最新文章
- npm安装less报错 rollbackFailedOptional: verb npm-session
- 科普丨人工智能发展的S曲线
- IOS开发--深拷贝与浅拷贝(mutableCopy与Copy)详解
- spring autowired idea都匹配上了_你清楚这几个Spring常用注解吗?
- 2 0 2 0 年 第 十 一 届 蓝 桥 杯 - 省赛 - Python大学组 - A. 门牌制作
- adb无法连接安卓手机
- antd 能自适应吗_一种能自适应识别母线运行方式的备自投装置应用探讨
- delphi 简单的发送字符串消息
- Python学习足迹
- 【直播回顾】Hello HarmonyOS系列应用篇完美收官!
- 用bmfont工具生成.fnt文件,但合成图片会分开问题
- git 上传出现“ ! [rejected] master -> master (non-fast-forward)”
- 栅格地图中自由区域之Bresenham算法及个人搜索算法对比
- Qt QPixmap旋转任意角度
- 用ue4怎么制作一个物体故障闪烁的特效
- Henway —— 小鸡过路游戏
- 六顶思考帽与单一职责
- 第二周总结(系统挂载重要目录、文件优化硬件软件安装)
- 域名欺诈之辩:美国最高法院最近的规定会否改变网站运营的方式?
- 博弈论进阶之Anti-SG游戏与SJ定理(转载)
热门文章
- Essential Lightwave 3D 8
- 【论文阅读】An Image Patch is a Wave: Quantum Inspired Vision MLP
- 检测到 #include 错误。请更新 includePath。无法打开 源 文件xxx
- 关于什么是逐行扫描的解释
- win10系统在电源选项中限制cpu最大频率(更新后丢失“处理器电源管理“项)
- 【达内课程】设计模式
- IOS6 自动布局 入门(1)
- 数字精准计算问题总结
- 张飞老师硬件第二十四部--马达驱动--原理图设计①----5三项直流无刷永磁电机相关
- opera32linux,Opera浏览器