经典算法:汉诺塔详解,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,保卫处兼职。这个冬天有点想看雪。

原文地址:https://www.cnblogs.com/taoxiaoyao/p/12186887.html