汉诺塔问题II
来源:互联网 发布:linux depth 编辑:程序博客网 时间:2024/05/17 03:00
今天看了一本书上的一个汉诺塔问题,和原本的汉诺塔问题有点不一样,就记录了下来。
package com.an.stack;/* * 汉诺塔问题(II) * 这里的汉诺塔修改了游戏规则,现在限制不能直接从左边的塔放到最右边,也不能从右边直接放到 * 左边,而是必须要经过中间.问:当有N层时,写出打印出的移动过程和最优移动的步数 * * 分析:如果剩下N层塔,从上到下一次为1~N,则有如下判断: * 1.如果剩下N层塔都在左边,希望全部放到中,则有三个步骤 * ① 将1~N层塔从左边放到右边,利用递归 * ② 再将第N层塔从左边放到中间 * ③ 再将N-1层塔从右边放到中间 * 2.如果剩下N层塔从“中”移到“左”,从“右”移到“中”,从“中”移到“右”,方法和1过程一样 * 也分为3个步骤。 * 3.如果剩下的N层塔都在左,希望移到右边.共分为5个步骤 * ① 将N-1层塔全部移到右边,利用递归 * ② 将第N层塔从左移到中。 * ③ 将N-1层塔全部由右全部移到左边 * ④ 将第N层塔从中移到右 * ⑤ 将N-1层塔从左全部移到右,利用递归 * 4.如果剩下的N层塔都在右,希望移到左边.共分为5个步骤,和情况三一样 * */public class HanioProblem1 {static int i=1;public static void main(String[] args) {HanioProblem1 hanio = new HanioProblem1();hanio.hanioProblem(2, "A", "B", "C");System.out.println("共需要"+ (i-1) +"步");}public int hanioProblem(int n,String left,String mid,String right){if(n < 0){return 0;}return process(n,left,mid,right,left,right);}private int process(int n, String left, String mid, String right, String from, String to) {if(n == 1){if(from.equals(mid) || to.equals(mid)){System.out.println("Move 1 from "+from + " to " + to +" 第"+(i++)+"步");return 1;}else{System.out.println("Move 1 from "+from + " to " + mid+" 第"+(i++)+"步");System.out.println("Move 1 from "+mid + " to " + to+" 第"+(i++)+"步");return 2;}}if(from.equals(mid) || to.equals(mid)){String another = (from.equals(left))||(to.equals(left))? right:left;int part1 = process(n-1, left, mid, right, from, another);int part2 = 1;System.out.println("Move "+n+" from "+from+" to "+to+" 第"+(i++)+"步");int part3 = process(n-1, left, mid, right, another, to);return part1 + part2 + part3;}else{int part1 = process(n-1, left, mid, right, from, to);int part2 = 1;System.out.println("Move " +n+" from "+ from + " to "+mid+" 第"+(i++)+"步");int part3 = process(n-1, left, mid, right, to, from);int part4 = 1;System.out.println("Move "+n+" from "+mid + " to "+right+" 第"+(i++)+"步");int part5 = process(n-1, left, mid, right, from, to);return part1+part2+part3+part4+part5;}}}
阅读全文
0 0
- 汉诺塔问题II
- hdoj1207-汉诺塔II(多柱汉诺塔问题)
- NIOS II 问题集锦
- 1888 三角形问题II
- Quartus II 问题集锦
- A+B问题II
- 参赛选手身高问题II
- javascript--&& II 问题总结
- 面试问题II
- 三角形问题II
- 三角形问题II
- LintCode-背包问题 II
- 星际争霸II 战斗问题
- 背包问题 II
- LintCode : 背包问题 II
- LintCode : 背包问题 II
- QT5 乱码问题 II
- 背包问题 II
- 文章标题
- Windows10下以管理员权限运行cmd
- 51Nod-1811-联通分量计数
- zookeeper中常见的命令
- TensorFlow 101 | 原理与概念
- 汉诺塔问题II
- Linux使用公钥ssh登录
- 设计模式———单例模式
- (转)好的投资应当是:善良为先,智慧为道,奋斗为本
- C++之类和对象(一)
- 安装thrift
- 洛谷P1460 健康的荷斯坦奶牛
- jQuery遍历之add()方法
- 总结:Hive,Hive on Spark和SparkSQL区别