栈与队列5——汉诺塔问题
题目
汉诺塔问题的基础上,增加限制,必须得经过中间,不能直接从左到右或从右到左,求当塔有N层的时候打印最优移动过程和最优移动总步数。
要求
- 法一:递归法
- 法二:非递归法,用栈来模拟
解析
法一:主要分两种情况
- 情况一:从左到中,从中到左,从右到中,从中到右,在这种情况下,需要走三步,以从左到中为例,第一步,将1~N-1从左到右(递归实现),第二步,将第N块从左到中,第三步,将1~N-1从右到中
- 情况二:从左到右,从右到左,在这种情况下,需要走五步,以从左到右为例,第一步,将1~N-1从左到右(这里需要解释一下为什么不是从左到中,因为如果从左到中的话,第N块需要从左直接到右,这是不被允许的),第二步,将第N块从左到中,第三步,将1~N-1从右到左,第四步,将第N块从中到右,第五步,将1~N-1从左到右
法一源码
public int hanoiProblem1(int num,String left,String mid,String right){if(num<1){return 0}return ;
}public int process(int num,String left,String mid,String right,String from,String to){if(num==1){if(from.equals(mid)||to.equals(mid)){System.out.println("Move 1 from "+from+" to "+to);return 1;}else{System.out.println("Move 1 from "+from+" to "+mid);System.out.println("Move 1 from "+mid+" to "+to);return 2;}}if(from.equals(mid)||to.equals(mid)){//3 steps eg:left->midString another=(from.equals(left)||to.equals(left))?rgiht:left;//step 1:move n-1 from->anotherint step1=process(num-1,left,mid,right,from,another);//step2 :move n from->to only costs 1 stepint step2=1;System.out.println("Move "+num+" from "+from+" to "+to);//step 3:move n-1 another->toint step3=process(num-1,left,mid,right,another,to);return step1+step2+step3;}else{//5 steps eg:left->right//step 1:move n-1 from->toint step1=process(num-1,left,mid,right,from,to);//step2 :move n from->mid only costs 1 stepint step2=1;System.out.println("Move "+num+" from "+from+" to "+mid);//step 3:move n-1 to->fromint step3=process(num-1,left,mid,right,to,from);//step4 :move n mid->to only costs 1 stepint step4=1;System.out.println("Move "+num+" from "+mid+" to "+to);//step 5:move n-1 from->toint step5=process(num-1,left,mid,right,from,to);return step1+step2+step3+step4+step5;}
}
法二非递归方法,见下一篇文章详解
栈与队列5——汉诺塔问题相关推荐
- 栈与队列5——汉诺塔问题(方案二)
题目 汉诺塔问题的基础上,增加限制,必须得经过中间,不能直接从左到右或从右到左,求当塔有N层的时候打印最优移动过程和最优移动总步数 要求 法一:递归法 法二:非递归法,用栈来模拟 解析 法二:非递归法 ...
- 由递推关系式用差分方程的方法得到通项公式实现求斐波那契数列的第n项;迭代、递归、栈、差分方程之间的本质联系以及由推广的迭代法解决“变态青蛙跳台阶”问题;汉诺塔问题的数字特征以及用递归解决的原理推导。
最近几天在研究算法中一个比较基础且突出的问题,就是关于"递推关系式.递归.迭代.序列前k项和"之间的区别与联系. 一.斐波那契数列与差分方程 首先我们考察一个经典的算法,求斐波那契 ...
- 2.2基本算法之递归和自调用函数_用栈算法递归解决汉诺塔问题
今天博主收一下线性表的尾,最近我们要学习的内容是栈和队列板块,栈和队列板块分为两讲,第一讲也就是今天我们主要学习栈的相关知识,包括栈的定义.栈的顺序表示及实现,栈的链式表示,栈的应用举例,以及栈递归实 ...
- 栈和队列----用栈求解汉诺塔问题
用栈求解汉诺塔问题 汉诺塔问题比较经典,现在修改一下汉诺塔游戏的规则:规定不能直接从左移动到右,也不能直接从右移动到左,必须经过中柱,求解当塔有N层的时候,打印最优移动过程和最优移动总步数. 可以采用 ...
- 汉诺塔(三)_栈的应用
问题 E: 汉诺塔(三) 时间限制: 3 Sec 内存限制: 128 MB 提交: 2 解决: 2 [提交][状态][讨论版] 题目描述 在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北 ...
- 汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)
文章目录 c语言简化版 C语言强化版(能看到每一步每个塔的情况)(使用了顺序栈库) main.c sequential_stack.cpp sequential_stack.h 运行结果 找了个汉诺塔 ...
- 左神算法:用栈来求解限制后的汉诺塔问题(Java版)
本题来自左神<程序员面试代码指南>"用栈来求解汉诺塔问题"题目. 题目 限制后的汉诺塔问题如下: 限制不能从最左侧的塔直接移动到最右侧,也不能从最右侧直接移动到最左侧, ...
- 用栈来求解汉诺塔变形问题
package stackAndQueue;import java.util.Stack;/*** 用栈来求解汉诺塔问题:HanoiStack[3]* * [问题描述]:将汉诺塔游戏(小压大)规则修改 ...
- 借汉诺塔理解栈与递归
我们先说,在一个函数中,调用另一个函数. 首先,要意识到,函数中的代码和平常所写代码一样,也都是要执行完的,只有执行完代码,或者遇到return,才会停止. 那么,我们在函数中调用函数,执行完了,就会 ...
最新文章
- 那些年你用过哪些消息中间件?为什么又弃了?现在用的是什么?
- 二十万字C/C++、嵌入式软开面试题全集宝典九
- Cloud for Customer的工作中心(work center)加载器
- leetcode 66 Plus One
- 访问者(Visitor Pattern )模式
- 【华为云技术分享】文字识别服务(OCR)基于对抗样本的模型可信安全威胁分析初析
- centos网卡发送被占满了_CentOS 查看实时网络带宽占用情况方法
- 软件定义重划边界——IT就是把复杂东西简单化
- AD(PCB)知识总结
- 股票的大底部形态,常见几种底部形态详解
- uniapp多选框组件太难用,自己手写一个它不香吗?
- 算法——递归与递推[蓝桥杯]
- 2、java的应用领域
- SQL Server数据库的增删改查
- 干货分享 | UE游戏鼠标双击判定
- 在Postgres里用Sequence[译]
- 追求浪漫;现实的自我;感悟人生
- Three.js中的3D文字效果
- 镜像拉取....网易云镜像中心
- CAN总线(二)——CAN2.0标准与协议分析