zoukankan      html  css  js  c++  java
  • 汉诺塔问题


    import java.util.Stack;

    /**
    * 汉诺塔问题,在一根柱子上从下往上按照大小顺序摞着64片圆盘,把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
    * 规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘
    */
    public class Hanoi {

    public static void main(String[] args) {
    int n = 3;
    hanoi1(n);
    System.out.println("============");
    hanoi2(n);
    System.out.println("============");
    hanoi3(n);
    }

    public static void hanoi1(int n) {
    leftToRight(n);
    }

    // 请把1~N层圆盘 从左 -> 右
    public static void leftToRight(int n) {
    if (n == 1) {
    System.out.println("Move 1 from left to right");
    return;
    }
    leftToMid(n - 1);
    System.out.println("Move " + n + " from left to right");
    midToRight(n - 1);
    }

    // 请把1~N层圆盘 从左 -> 中
    public static void leftToMid(int n) {
    if (n == 1) {
    System.out.println("Move 1 from left to mid");
    return;
    }
    leftToRight(n - 1);
    System.out.println("Move " + n + " from left to mid");
    rightToMid(n - 1);
    }

    public static void rightToMid(int n) {
    if (n == 1) {
    System.out.println("Move 1 from right to mid");
    return;
    }
    rightToLeft(n - 1);
    System.out.println("Move " + n + " from right to mid");
    leftToMid(n - 1);
    }

    public static void midToRight(int n) {
    if (n == 1) {
    System.out.println("Move 1 from mid to right");
    return;
    }
    midToLeft(n - 1);
    System.out.println("Move " + n + " from mid to right");
    leftToRight(n - 1);
    }

    public static void midToLeft(int n) {
    if (n == 1) {
    System.out.println("Move 1 from mid to left");
    return;
    }
    midToRight(n - 1);
    System.out.println("Move " + n + " from mid to left");
    rightToLeft(n - 1);
    }

    public static void rightToLeft(int n) {
    if (n == 1) {
    System.out.println("Move 1 from right to left");
    return;
    }
    rightToMid(n - 1);
    System.out.println("Move " + n + " from right to left");
    midToLeft(n - 1);
    }

    public static void hanoi2(int n) {
    if (n > 0) {
    func(n, "left", "right", "mid");
    }
    }

    // 1~i 圆盘 目标是from -> to, other是另外一个
    public static void func(int N, String from, String to, String other) {
    if (N == 1) { // base
    System.out.println("Move 1 from " + from + " to " + to);
    } else {
    func(N - 1, from, other, to);
    System.out.println("Move " + N + " from " + from + " to " + to);
    func(N - 1, other, to, from);
    }
    }

    public static void hanoi3(int N) {
    if (N < 1) {
    return;
    }
    Stack<Record> stack = new Stack<>();
    stack.add(new Record(false, N, "left", "right", "mid"));
    while (!stack.isEmpty()) {
    Record cur = stack.pop();
    if (cur.base == 1) {
    System.out.println("Move 1 from " + cur.from + " to " + cur.to);
    if (!stack.isEmpty()) {
    stack.peek().finish1 = true;
    }
    } else {
    if (!cur.finish1) {
    stack.push(cur);
    stack.push(new Record(false, cur.base - 1, cur.from, cur.other, cur.to));
    } else {
    System.out.println("Move " + cur.base + " from " + cur.from + " to " + cur.to);
    stack.push(new Record(false, cur.base - 1, cur.other, cur.to, cur.from));
    }
    }
    }
    }

    public static class Record {

    public boolean finish1;

    public int base;

    public String from;

    public String to;

    public String other;

    public Record(boolean f1, int b, String f, String t, String o) {
    finish1 = false;
    base = b;
    from = f;
    to = t;
    other = o;
    }

    }

    }

    /* 如有意见或建议,欢迎评论区留言;如发现代码有误,欢迎批评指正 */
  • 相关阅读:
    js浏览器之浏览器对象
    js浏览器
    js面向对象编程之创建对象
    js面向对象编程
    STS清理
    使用STS新的工作空间无需再配置
    去掉文本框中的空格
    MySQL轻量版使用,无需安装,无脑操作
    Eclipse&STS常用小技巧
    如何配置上传虚拟路径问题?
  • 原文地址:https://www.cnblogs.com/laydown/p/13670930.html
Copyright © 2011-2022 走看看