汉诺塔问题(java)

汉诺塔问题:

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

编程要求:

  • 有A、B、C三根柱子,A为起始柱,B为辅助柱,C为目标柱,以及若干圆盘,圆盘按上小下大的顺序堆放在A柱上,从上到下依次为每一个圆盘标号为 1 到 n

  • 输入圆盘数,要求将A柱的圆盘移动到C柱,一次只能移动一个,过程中可以任意使用三根柱子,但是要保证小圆盘始终在上

  • 输出每一个圆盘每一步移动的过程,比如:1号圆盘从 A -> C

做题思路:

假设是有五个圆盘,int n 收入,则可把五个圆盘看作两个部分,最底层一个为n底层往上四个则为n-1:

汉诺塔问题(java)_第1张图片

做题步骤:

  • 1.将n-1从A柱移动到B柱;

  • 2.将n从A柱移动到B柱;

  • 3.最后将n-1从B柱移动到C柱;

  • 注意不止有两层所以这题使用递归思想,首先找到递归结束条件即n=1的时候(即只有一个圆盘)

得出直接从A柱移动到C柱。

代码实现

import java.util.Scanner;
public class hannuota{
//创建一个main方法
    public static void main(String[] args){
        Scanner myscanner = new Scanner(System.in);
        T t = new T();
        System.out.println("请输入要移动的盘子数");
        int n = myscanner.nextInt();
        t.move(n,'A','B','C');
    }
}
class T{
    public void move(int n,char a,char b,char c){//定义层数,盘子
        if(n == 1){
            System.out.println("第" + n + "个圆盘从" + a + "->" + c);//递归退出条件只有一个圆盘时从A柱移动到C柱
        }else{
            move(n - 1,a,c,b);//移动n - 1部分的圆盘从A->B
            System.out.println("第" + n + "个圆盘从" + a + "->" + c);
            move(n - 1,b,a,c);//移动n - 1部分的圆盘从A->B
        }
    }
}

总结

本题运用递归思想,分成n和n-1两部分,如果要深入继续往后递归,可能比较复杂,主要是想出本题的主要思想,可以入手前先从较少的圆盘数开始用穷举,慢慢得出规律,本人也是刚接触递归,做法可能欠缺希望能帮到你,如果有哪方面可以优化,望大佬指正

你可能感兴趣的:(java,开发语言)