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;
    }

    }

    }

    /* 如有意见或建议,欢迎评论区留言;如发现代码有误,欢迎批评指正 */
  • 相关阅读:
    uniapp的v-for的key不同平台的兼容解决
    想好要做什么,然后就放手去做吧!
    中国姓氏大全(常见508个,罕见740个)
    swiper鼠标移入停止滚动 移出开始滚动
    swiper文字垂直滚动(公告栏)
    简体生僻汉字大全21418个-GBK编码中的汉字
    uniapp终极查bug大法-无私分享
    uniapp数据更新了但是页面没有渲染-解决方案
    uniapp引入font-awsome字体图标-疑难解决
    优化问题及KKT条件
  • 原文地址:https://www.cnblogs.com/laydown/p/13670930.html
Copyright © 2011-2022 走看看