汉诺塔

柔情痞子 提交于 2020-02-12 22:51:02

汉诺塔

先带大家了解一下汉诺塔。

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

 例:先用三个盘子分析一下解题思路——

1、先是给A柱上放三个盘子,标号为1(顶层)、2(中层)、3(底层),刚好符合从大到小;

2、再把1和2看成一个整体,因此A柱上的盘子就有两个,(1,2)(顶层)、3(底层);

3、先把(1,2)盘移到B柱上,再把3移到C柱上;

4、这下把(1,2)又分开,就成了1、2,并且都在B柱上,现在又把1移到A柱上;

5、再把2移到C柱上,再把最后一个盘子1移到C柱上,目标达成。

 如果为64个盘子————先把前面63个看成一个整体,64因此就被分为两个部分,接着把63又分为两个部分,前62个盘子和63,  以此类推。具体实现步骤如下:

import java.util.Scanner;
/*
汉诺塔————要求:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
                操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,
                        小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
在整个过程中具体所要注意的事项是:
                                1、有三根柱子,分别为:A(起始柱)、B(辅助柱)、C(目标柱)
                                2、A柱上拥有64个盘子,一次是从下到上,从大到小(即大盘在下面,小盘在上面)
                                3、每一次只能移动一个盘子,并且每一根柱上都得是大盘在下,小盘在上
                                4、最终把A柱上的盘子全部移动到C柱上
先用三个盘分析一下思路:
                    再分析思路之前先介绍一下递归,什么是递归?
                    递归算是一种解题的思想,就是把大问题化小,再把小的问题合并成最终所想要的结果。例:形如下面二叉树
                                                    9
                                    4                               5
                                1       3                   2               3
                                    1       2           1       1       1       2
                            ·······
                                                                2——(1,1)
                                                    3——(1,2)
                                        4——(1,3)  
                                                    1
                            9——(4,5)              
                                                    2——(1,1)
                                        5——(2,3)               1
                                                    3——(1,2)
                                                                 2——(1,1)
                    先是由大到小一层的一层分,之后又从小返回到大,整个过程就叫做递归。
                具体思路:
                        1、先是给A柱上放三个盘子,标号为1(顶层)、2(中层)、3(底层),刚好符合从大到小;
                        2、再把1和2看成一个整体,因此A柱上的盘子就有两个,(1,2)(顶层)、3(底层);
                        3、先把(1,2)盘移到B柱上,再把3移到C柱上;
                        4、这下把(1,2)又分开,就成了1、2,并且都在B柱上,现在又把1移到A柱上;
                        5、再把2移到C柱上,再把最后一个盘子1移到C柱上,目标达成。
                如果为64个盘子,也是运用递归的思想————先把前面63个看成一个整体,64因此就被分为两个部分,接着把63又分为两个部分,前62个盘子和63,
                                                以此类推。
具体实现步骤如下:
 */
class Test02{
    public static void main(String[] args){
        Scanner input=new Scanner(System.in);
        System.out.print("请输入层数n:");
        int n=input.nextInt();
        System.out.print("请输入A、B、C:");
        String str1=input.next();
        String str2=input.next();
        String str3=input.next();
        hanNuo(n,str1,str2,str3);
    }
    public static void hanNuo(int n,String str1,String str2,String str3){
        if(n==1){
            System.out.println(str1+"->"+str3);
        }else{
            hanNuo(n-1,str1,str3,str2);
            System.out.println(str1+"->"+str3);
            hanNuo(n-1,str2,str1,str3);
            //System.out.println(str2+"->"+str3);
        }
    }
}

 谢谢大家·········

                

                                              

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!