• 递归之汉诺塔问题


    汉诺塔问题:

    古代有一个梵塔,塔内有三个座A,B,C。A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。

    有一个和尚想把这64个盘子从A座移动到C座,但是每次只允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。

    在上述移动过程中可以利用B座,要求输出一定的步骤:

    求解思路:

    可以将问题求解简单分为三个步骤:

    (1)把n-1个盘子由A 移到 B;

    (2)把第n个盘子由 A移到 C;

    (3)把n-1个盘子由B 移到 C;

    这样就将原问题分解成了形式形同、规模变小的子问题 

      1个圆盘的次数 2的1次方减1

      2个圆盘的次数 2的2次方减1

           3个圆盘的次数 2的3次方减1

           。  。   。    。   。 

           n个圆盘的次数 2的n次方减1

       故:移动次数为:2^n - 1

    递归代码实现:

    package com.tcxpz.demo;
    
    import java.util.Scanner;
    public class Hanoi {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            hanoi(n,"A","B","C");
        }
        private static void hanoi(int n,String source,String spare,String target){
            if(n==1){
                System.out.println("From "+source+" To "+target);
                return;
            }else{
                //将n-1各盘子从source搬到spare,以target为周转盘
                hanoi(n-1,source,target,spare);
                //将最后一个盘子从source搬到target
                System.out.println("From "+source+" To "+target);
                //再将spare上的n-个盘子搬到target,以source为周转盘
                hanoi(n-1,spare,source,target);
                return;
            }
        }
    }
  • 相关阅读:
    大数加法、乘法实现的简单版本
    hdu 4027 Can you answer these queries?
    zoj 1610 Count the Colors
    2018 徐州赛区网赛 G. Trace
    1495 中国好区间 尺取法
    LA 3938 动态最大连续区间 线段树
    51nod 1275 连续子段的差异
    caioj 1172 poj 2823 单调队列过渡题
    数据结构和算法题
    一个通用分页类
  • 原文地址:https://www.cnblogs.com/tcxpz/p/11481311.html
Copyright © 2020-2023  润新知