zoukankan      html  css  js  c++  java
  • 经典算法:汉诺塔详解,java实现

    经典算法题:汉诺塔

    题目描述:

    相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

    image-20200113130228504

    骚里骚气分析:

    解决办法之一是用手抓起来直接挪过去,简单粗暴(粗鲁)。区区几个小方块而已,还难不倒我。

    事实真的是这样嘛,往往很多时候,现实中看似简单的背后蕴含许多细节,而忽略细节的人面临的将是失败。

    我们都不畏惧失败,因为我们终将成功!但是不必要的挫折却会使你一蹶不振。你不是不够聪明,只是还缺少一双发现细节的眼睛~。要知道这个游戏可是被放到四大文明古国—古印度的神庙里。就像古埃及金字塔那些神秘的数字一样,令科学家们都感到不可思议。我们不能小瞧了他,更不可掉以轻心,就让我们郑重其事端正态度。所以请你务必穿一身黑色西服,擦亮你的爱马仕皮鞋,把头发梳成大人的模样进入战斗状态。天黑的路虽没有尽头,可是你别忘了么,那一年我们一起变成了光!请记住!一定要全力以赴,不给自己退路!Maybe下一刻的你将光芒万丈!


    正儿八经解题:

    汉诺塔移动思想分三步:

    1、将上面的第1层~第(n-1)层从初始位置移动到中间位置
    2、再将第n层移动到目标位置
    3、最后将第1层到~第(n-1)层从中间位置移动到目标位置(三者顺序不能变)

    有疑惑???规则不是说每次只能移动一个汉诺塔么,假如n>2,那么第一步跟第三步都涉及到移动多个汉诺塔,这还怎么移?
    第一步和第三步又将问题带回了 ”将n块汉诺塔从初始位置移动到目标位置“ ,不同的是:
    1、移动的初始位置跟目标位置改变,
    2、移动的数量n的值变成了n-1。

    */

    刚开始学习递归的时候脑海里想不出来递归怎么实现的,还是要动笔推一下,想是想不完的。下面是调用一次递归函数,程序在调用函数跑起来的时候,就像一次请求被一层层处理并且转发,被原路返回响应一样。第一个响应数据必然是第二个响应要用到的数据。

    image-20200113144425405

    代码

    import java.util.Scanner;
    
    public class hanoi {
        
        public static void hanio(int n,String A,String B,String C){
            if(n<1){   
                System.out.println("汉诺塔的层数不得小于一");
            }
            else if(n==1){   //递归出口
                System.out.println("移动:"+A+"——》"+C);
                return;
            }
            else{            //核心移动三步
                hanio(n-1,A,C,B);
                System.out.println("移动:"+A+"——》"+C);
                hanio(n-1,B,A,C);
            }
        }
        public static void main(String args[]){
                String a = "a";
                String b = "b";
                String c = "c";
                hanio(3,a,b,c);
        }
    }
    

    截图:

    image-20200113132055639

    心情_2020011314:36,保卫处兼职。这个冬天有点想看雪。

  • 相关阅读:
    ASP日期格式化函数
    HTML友情链接代码
    JS判断是否为数字或为空
    ASP查询数据RS转换成COMMAND
    PHP文本的读写
    负边距的应用
    EntityFramework数据持久化 Linq介绍
    EntityFramework数据持久化 Linq介绍
    EntityFramework数据持久化 Linq介绍
    EntityFramework数据持久化 Linq语法应用
  • 原文地址:https://www.cnblogs.com/taoxiaoyao/p/12186887.html
Copyright © 2011-2022 走看看