用栈求解汉诺塔问题(每日一道算法题)
来源:互联网 发布:知乎匿名回答在哪看 编辑:程序博客网 时间:2024/05/16 09:04
今天的题目有点难,所以只理解了一点,但是为了记录自己每天都有收获,还是将我理解的部分贴出来:
首先,如果只剩最上层的塔需要移动,则有如下处理:
1.如果希望从“左”移到“中”,打印“Move 1 from lef to mid”.
2.如果希望从“中”移到“左”,打印“Move 1 from mid to left”.
3.如果希望从“中”移到“右”,打印“Move 1 from mid to right”.
4.如果希望从“右”移到“中”,打印“Move 1 from right to mid”
5如果希望从“左”移到“右”,打印“Move 1 from left to mid” 和“Move 1 from mid to right”
6.如果希望从“右”移到“左”,打印“Move 1fromrighttomid” 和“Move 1 from mid to left”
以上过程就是递归的终止条件,也就是只剩上层塔时的打印过程。
接下来,我们分析剩下多层塔的情况。
如果剩下N层塔,从最上到最下依次为1~N,则有如下判断:
1.如果剩下的N层塔都在“左”,希望全部移到“中”,则有三个步骤。
1) 将1~N-1层塔先全部从“左”移到“右”,明显交给递归过程。
2) 将第N层塔从“左”移到“中”。
3) 再将1~N-1层塔全部从“右”移到“中”,明显交给递归过样。.
从“右”移到“
2.如果把剩下的N层塔从“中”移到“左”,从“中”移到“右,
过程与情况1同理,一样是分解为三步,在此不再详述。
则有五个步骤。
3.如果剩下的N层塔都在“左”,希望全部移到“右”,
1) 将1~N-1层塔先全部从“左”移到“右”,明显交给递归过程。
2) 将第N层塔从“左”移到“中”。
3) 将1~N-1层塔全部从“右”移到“左”,明显交给递归过程。
4) 将第 N层塔从“中”移到“右”。
5) 最后将1~N-1层塔全部从“左”移到“右”,明显交给递归过程。
4.如果剩下的N 层塔都在“右”,希望全部移到“左”,过程与情况3 同理,一样
为五步,在此不再详述。
public static int hanio(int num,String left,String mid,String right) { if(num<1) { return 0; }else { return process(num,left,mid,right,left,right);//从左到右 } } public static int process(int num,String left,String mid,String right,String from,String to) { if(num==1) { if("mid".equals(from)||"mid".equals(to)) { 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("mid".equals(from)||"mid".equals(to)) { String another = (from.equals("left")||to.equals("left"))?right:left; int part1 = process(num-1,left,mid,right,from,another); int part2 = 1; System.out.println("move "+num+ " from"+from+"to"+another); int part3 = process(num-1,left,mid,right,another,to); return part1+part2+part3; }else { int part1 = process(num-1,left,mid,right,from,to); int part2 = 2; System.out.println("move "+num+" from"+from+"to"+mid); int part3 = process(num-1,left,mid,right,to,from); int part4 = 1; System.out.println("move "+num+" from"+mid+"to"+to); int part5 = process(num-1,left,mid,right,from,to); return part1+part2+part3+part4+part5; } }
未完待续。。。。
- 用栈求解汉诺塔问题(每日一道算法题)
- 用栈实现队列(每日一道算法题)
- 【每日一道算法题】
- 【每日一道算法题】
- 【每日一道算法题】
- 【每日一道算法题】
- 【每日一道算法题】
- 【每日一道算法题】
- 每日一道算法题(1)
- 每日一道算法题(2)
- 每日一道算法题(3)
- 每日一道算法题(4)
- 每日一道算法题(5)
- 每日一道算法题(6)
- 每日一道算法题(7)
- 用递归函数和栈操作逆序一个栈(每日一道算法题)
- 用一个栈实现另一个栈的排序(每日一道算法题)
- 猫狗算法(每日一道算法题)
- 类/对象大小的计算
- 二. FragmentLayout 加上 TabLayout 进行嵌套碎片 主方法内
- 【云星数据---Apache Flink实战系列(精品版)】:Apache Flink高级特性与高级应用005-Flink的作业调度情况002
- JSON 数据格式
- Python-dict和set(学习笔记2)
- 用栈求解汉诺塔问题(每日一道算法题)
- MySql 时间类型转为字符串
- java按位运算符(&、|、~、^) 移位操作符(>> << >>> )
- Flum入门必备知识
- 变量的存储类别小总结
- 20.当数据量超过一万后天接收不到前台传递过来的数据
- phpcms v9 目录式伪静态
- Android 如何使用小的Ratingbar
- Linux基础