package stackAndQueue;import java.util.Stack;/*** 用栈来求解汉诺塔问题:HanoiStack【3】* * 【问题描述】:将汉诺塔游戏(小压大)规则修改,不能从左(右)侧的塔直接移到右(左)侧,而是必须经过中间塔。* * 求当塔有N层时,打印最优移动过程和最优移动步数。如N=2,记上层塔为1,下层为2.则打印:1:left->mid;1* * 由于必须经过中间,实际动作只有4个:左L->中M,中->左,中->右R,右->中。* * 原则:①小压大;②相邻不可逆(上一步是L->M,下一步绝不能是M->L)* * 非递归方法核心结论:1.第一步一定是L-M;2.为了走出最少步数,四个动作只可能有一个不违反上述两项原则。* * 核心结论2证明:假设前一步是L->M(其他3种情况略)* * a.根据原则①,L->M不可能发生;b.根据原则②,M->L不可能;c.根据原则①,M->R或R->M仅一个达标。* * So,每走一步只需考察四个步骤中哪个步骤达标,依次执行即可。* * @author xiaofan*/
public class HanoiStack {private enum Action {None, LToM, MToL, MToR, RToM};static Action preAct = Action.None; // 上一步操作,最初什么移动操作都没有final static int num = 4; // 汉诺塔层数public static void main(String[] args) {int steps = transfer(num);System.out.println("It will move " + steps + " steps.");}private static int transfer(int n) {Stack<Integer> lS = new Stack<>(); // java7菱形用法,允许构造器后面省略范型。Stack<Integer> mS = new Stack<>();Stack<Integer> rS = new Stack<>();lS.push(Integer.MAX_VALUE);// 栈底有个最大值,方便后续可以直接peek比较mS.push(Integer.MAX_VALUE);rS.push(Integer.MAX_VALUE);for (int i = n; i > 0; i--) {lS.push(i);// 初始化待移动栈}int step = 0;while (rS.size() < n + 1) {// n+1,因为rS.push(Integer.MAX_VALUE);等于n+1说明全部移动完成step += move(Action.MToL, Action.LToM, lS, mS);// 第一步一定是LToMstep += move(Action.LToM, Action.MToL, mS, lS);// 只可能有这4种操作step += move(Action.MToR, Action.RToM, rS, mS);step += move(Action.RToM, Action.MToR, mS, rS);}return step;}/*** 实施移动操作.* * @param cantAct*            不能这样移动* @param nowAct*            即将执行的操作* @param fromStack*            起始栈* @param toStack*            目标栈* @return step(成功与否)*/private static int move(Action cantAct, Action nowAct, Stack<Integer> fromStack, Stack<Integer> toStack) {if (preAct != cantAct && toStack.peek() > fromStack.peek()) {toStack.push(fromStack.pop()); // 执行移动操作System.out.println(toStack.peek() + ":" + nowAct);preAct = nowAct; // 更新“上一步动作”return 1;}return 0;}
}

代码地址:https://github.com/zxiaofan/Algorithm/tree/master/src/stackAndQueue

用栈来求解汉诺塔变形问题相关推荐

  1. 栈和队列----用栈求解汉诺塔问题

    用栈求解汉诺塔问题 汉诺塔问题比较经典,现在修改一下汉诺塔游戏的规则:规定不能直接从左移动到右,也不能直接从右移动到左,必须经过中柱,求解当塔有N层的时候,打印最优移动过程和最优移动总步数. 可以采用 ...

  2. Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏

    Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏 目录 输出结果 核心代码 输出结果 核心代码 def hanoi(n,x,y,z):if n==1:print(x,'--→',z) ...

  3. Java 通过递归求解汉诺塔问题 源码 经典递归问题讲解

    汉诺塔问题描述:有三根柱子 A.B.C ,在A从下向上按照从大到小的顺序放着64个圆盘,以B为中介,把盘子全部移动到C上.移动过程中,要求任意盘子的下面要么没有盘子,要么只能有比它大的盘子. 分析:为 ...

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

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

  5. python汉诺塔游戏_python求解汉诺塔游戏

    本文实例为大家分享了python求解汉诺塔游戏的具体代码,供大家参考,具体内容如下 一.问题定义 百度百科定义:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.据说大梵天创造世界的时候做了三 ...

  6. C语言——生存期和存储类型、递归、递归求解汉诺塔、快速排序

    目录 一.生存期和存储类型 1.生存期 2.存储类型 3.自动变量(auto) 4.寄存器变量(register) 5.静态局部变量(static) 6.static 和 extern 二.递归 1. ...

  7. java实现求解汉诺塔问题(提示, 使用递归)

    实现代码: 求解汉诺塔问题(提示, 使用递归) 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从 ...

  8. 三.栈与栈的实例——汉诺塔

    1.栈 First In Last Out,顺序栈和链栈,六种方法,声明使用方式. 1.1 概论 栈,是一个先进先出的一个数据结构.如图: 1.2 顺序栈和链栈 顺序栈就是一般的栈. 链栈就是使用链表 ...

  9. 分治算法求解汉诺塔问题

    1.什么是分治算法? 分治算法,字面理解"分而治之",就是把一个复杂的问题分成两个或者更多的相同或者相似的子问题,再把子问题分成更小的子问题...直到最后子问题可以直接简单求解,原 ...

最新文章

  1. Kafka不停机,如何无感知迁移ZooKeeper集群?
  2. 设计模式 之 装饰者模式
  3. 在家办公的第一天,钉钉、企业微信集体“崩溃”...
  4. 关于BGP的notification错误码的解释
  5. mysql客户端( Navicat)远程登录操作问题 1142-create command denied to user×××
  6. SQL Server FOR XML PATH 语句的应用
  7. Hbase总结(八)Hbase中的Coprocessor
  8. Coursera自动驾驶课程第9讲:Visual Features Detection Description and Matching
  9. TCP/IP详解 笔记十一
  10. adnroid中LayoutParams的简单总结
  11. plsql无法连接64位oracle已解决
  12. 开源图像识别、imageai图像识别、对象识别、识别人、车、猫、狗等80种 简易版
  13. 基于Android studio开发的图灵智能聊天机器人
  14. 睡眠革命——摘抄总结大纲
  15. 服务器虚拟机如何复制文件,Windows中复制虚拟机
  16. 手电筒安卓_开号以来安卓软件汇总!
  17. 仿铁路订票系统Gridview
  18. 和i77700性能一样的服务器cpu,Intel八代i7 8700K和七代i7 7700K性能对比测验
  19. 上门洗车APP --- Androidclient开发 之 网络框架封装介绍(二)
  20. 若要接收后续 google chrome 更新,您需使用 windows 10 或更高版本

热门文章

  1. Reducing the Dimensionality of Data with Neural Networks:神经网络用于降维
  2. 人工机器:NDC-谷歌机器翻译破世界纪录,仅用Attention模型,无需CNN和RNN
  3. JNI传递字符串数组J-StringArray
  4. 计算机专业 操作系统,计算机操作系统
  5. 一起学React--组件定义和组件通讯
  6. 使用 yield 减少内存消耗
  7. Java8 lambda支持
  8. lock和wait+signal
  9. 广东--阳江--闸波一天游归来,上PP~~
  10. Flink中的window知识体系与scala完整案例