zoukankan      html  css  js  c++  java
  • 递归--Java_汉诺塔

    背景:

    有三根细柱(A、B、C)。A柱上套着5个圆盘。这些圆盘大小各异,按从大到小的顺序自下而上摆放。

    现在要把套在A柱上的5个圆盘全部移到B柱上。并且在移动圆盘时遵守下述规则:

    • 一次只能移动柱子最上端的一个圆盘。
    • 小圆盘上不能放大圆盘。

     思考:

    • 1个圆盘直接将B;
    • 2个圆盘将第1个圆盘搬到C,然后将第2个圆盘搬到B,第一个圆盘再搬到B;
    • 3个圆盘将前2个搬到C,然后第3个圆盘搬到B,前2个圆盘搬到B;
    •     ...
    • n个圆盘将前n-1个搬到C,然后第n个圆盘搬到B,前n-1个圆盘搬到B:

                    f(n-1)--->C

                    f(n)--->B

                    f(n-1)--->B

    实现:

          

    import java.util.Scanner;
    
    public class Hanoi {
    
        private static Scanner in;
        private static int i;
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            in = new Scanner(System.in);
            System.out.println("请输入需要移动的圆盘的个数:");
            int number = in.nextInt();
            char start = 'A';
            char end = 'B';
            char transfer = 'C';
            moveDisk(number, start, end, transfer);
            System.out.println("汉诺塔总共移动的次数:" + i);
    
        }
    
        public static void moveDisk(int n, char start, char end, char transfer) {
    
            if (n > 0) {
                // 因为小圆盘上不能放大圆盘,n-1块圆盘肯定是在中转站
                moveDisk(n - 1, start, transfer, end);
                // ‘最后一块’放到目的地
                System.out.println("第" + n + "个塔移动:" + start + "--->" + end);
                // 把n-1块送回到目的地
                moveDisk(n - 1, transfer, end, start);
                i++;
            }
    
        }
    
    }
  • 相关阅读:
    20.12.21 leetcode316
    20.12.18 leetcode389
    NOIP2017退役记
    DNA序列 LOJ NOIP模拟赛 D1T1 字符串哈希
    解药还是毒药 codevs2594 状态压缩 BFS
    换教室 vijos2005 NOIP2016 D1T3 期望DP 图论最短路(雾)
    都市大飙车 UESTC 1652 概率DP
    添加括号 vijos1038 动态规划 区间DP
    一道神奇的并查集
    还有一道神奇的暴力(正解是要旋转坐标轴的)
  • 原文地址:https://www.cnblogs.com/ninarming/p/7027173.html
Copyright © 2011-2022 走看看