栈与队列5——汉诺塔问题(方案二)
题目
汉诺塔问题的基础上,增加限制,必须得经过中间,不能直接从左到右或从右到左,求当塔有N层的时候打印最优移动过程和最优移动总步数
要求
- 法一:递归法
- 法二:非递归法,用栈来模拟
解析
法二:非递归法,用栈实现
把左,中,右抽象成栈,分别即为ls,ms,rs,最初所有的块都在ls上,总共只能有四个动作,左到中,中到右,右到中,中到左,因为一次移动必须经过中间。每次都是从一个栈的栈顶弹出然后压入另外一个栈里。
两个原则:1>不能小压大2>相邻不可逆(当前从L->M,下一步不能从M->L)
结论:
- 第一步一定是L->M
- 在走出最少步数的过程中,四个动作只有一个动作可以满足上面的两个原则。
法二源码
public enum Action{No,LtoM,MtoL,MtoR,RtoM
}public int hanoiProblem2(int num,String left,String mid,String right,){Stack<Integer> lS=new Stack<Integer>();Stack<Integer> mS=new Stack<Integer>();Stack<Integer> rS=new Stack<Integer>();ls.push(Integer.MAX_VALUE);ms.push(Integer.MAX_VALUE);rs.push(Integer.MAX_VALUE);for(int i=num;i>0;i--){lS.push(i);}Action[] record={Action.No};int step=0;while(!rS.size()!=num+1){step+=fStackToStack(record,Action.MtoL,Action.LtoM,lS,mS,left,mid);step+=fStackToStack(record,Action.LtoM,Action.MtoL,mS,lS,mid,left);step+=fStackToStack(record,Action.RtoM,Action.MtoR,mS,rS,mid,right);step+=fStackToStack(record,Action.MtoR,Action.RtoM,rS,mS,right,mid);}return step;
}
public static int fStackToStack(Action[] record, Action preNoAct,Action nowAct,Stack<Integer> fStack,Stack<Integer> tStack,String from,String to){if(record[0]!=preNoAct&&fStack.peek(),tStack.peek()){tStack.push(fStack.pop());System.out.println("Move "+tStack.peek()+" from "+from+" to "+to);record[0]=nowAct;return 1;}return 0;
}
这道题有点难,欢迎大家交流讨论~
栈与队列5——汉诺塔问题(方案二)相关推荐
- 栈与队列5——汉诺塔问题
题目 汉诺塔问题的基础上,增加限制,必须得经过中间,不能直接从左到右或从右到左,求当塔有N层的时候打印最优移动过程和最优移动总步数. 要求 法一:递归法 法二:非递归法,用栈来模拟 解析 法一:主要分 ...
- 由递推关系式用差分方程的方法得到通项公式实现求斐波那契数列的第n项;迭代、递归、栈、差分方程之间的本质联系以及由推广的迭代法解决“变态青蛙跳台阶”问题;汉诺塔问题的数字特征以及用递归解决的原理推导。
最近几天在研究算法中一个比较基础且突出的问题,就是关于"递推关系式.递归.迭代.序列前k项和"之间的区别与联系. 一.斐波那契数列与差分方程 首先我们考察一个经典的算法,求斐波那契 ...
- 2.2基本算法之递归和自调用函数_用栈算法递归解决汉诺塔问题
今天博主收一下线性表的尾,最近我们要学习的内容是栈和队列板块,栈和队列板块分为两讲,第一讲也就是今天我们主要学习栈的相关知识,包括栈的定义.栈的顺序表示及实现,栈的链式表示,栈的应用举例,以及栈递归实 ...
- 汉诺塔问题的Java实现(递归与非递归)
文章目录 一.汉诺塔问题描述 二.汉诺塔解题思路 三.递归 四.非递归 一.汉诺塔问题描述 汉诺塔问题就是有三张柱子A.B.C,然后初始化在A上放了N个圆盘,圆盘按照小压大的方式堆放,需要用最少的步骤 ...
- 汉诺塔相关介绍及计算
汉诺塔的相关题目及计算 汉诺塔的相关介绍及分析 简介 经典汉诺塔 求最小移动次数 汉诺塔的相关介绍及分析 简介 前两天无意中提到了汉诺塔就重新刷了一下相关的题目,感觉有些题目有很多巧妙之处,提到汉诺塔 ...
- Python3趣味系列题4------非递归解决三阶汉诺塔以及动态展示过程
一.问题描述 法国数学家爱德华·卢卡斯曾编写过一个关于印度的古老传说:在世界中心贝拿勒斯的圣庙里,一块黄铜板上插着三根宝石针,印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的 ...
- 栈和队列----用栈求解汉诺塔问题
用栈求解汉诺塔问题 汉诺塔问题比较经典,现在修改一下汉诺塔游戏的规则:规定不能直接从左移动到右,也不能直接从右移动到左,必须经过中柱,求解当塔有N层的时候,打印最优移动过程和最优移动总步数. 可以采用 ...
- 汉诺塔(三)_栈的应用
问题 E: 汉诺塔(三) 时间限制: 3 Sec 内存限制: 128 MB 提交: 2 解决: 2 [提交][状态][讨论版] 题目描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北 ...
- 汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)
文章目录 c语言简化版 C语言强化版(能看到每一步每个塔的情况)(使用了顺序栈库) main.c sequential_stack.cpp sequential_stack.h 运行结果 找了个汉诺塔 ...
最新文章
- 细心看完这篇文章,刷新对Javascript Prototype的理解
- 常用的设计模式汇总,超详细!
- 2016-11-17试题解题报告
- 【自动驾驶】4.分布式实时通信——DDS技术
- 标准的JS里,eval和window.eval属于不同的语法!
- XCTF-Reverse:insanity
- 用C#写的一个注册表操作类
- HTML特殊编码转换
- spark学习-Spark广播变量与共享变量(1)
- java 内存泄漏样例_一次线上Java应用内存泄漏分析实例
- 【Java数据结构】栈和队列
- 安卓intent发起广播事件给系统或当前app,并从系统或当前app中接收广播
- C#中计算两个时间的差
- javascript对象概念大全
- java 异常抛出_Java 如何抛出异常、自定义异常、手动或主动抛出异常
- 泰勒展开-常用优化实例
- 360浏览器插件360抢票王火车票刷票技巧
- 变形金刚11280超清迅雷下载
- mfc 定时器绘制旋转六边形_OpenGL——旋转的六边形(动画)
- smbd服务器-网络磁盘映射