使用Java解决汉诺塔问题

我们先看看所给出的原题目:汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

话不多说,我们直接看代码:

/**
 * @author 语仄无言
 */
public class 汉诺塔 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        TowerP towerP = new TowerP();
        System.out.println("请输入汉诺塔的层数:");
        int i = scanner.nextInt();
        int move = towerP.move(i, 'A', 'B', 'C');
        System.out.println("共移动:"+move + "次");
    }
}

class TowerP {
    /**
     * num表示要移动的个数,a,b,c分别表示A塔,B塔,C塔
     */
    int a1 = 0;
    public int move(int num, char a, char b, char c) {
        //如果个数只有一个,则可以直接运行并结束
        if (num == 1) {
            a1 += 1;
            System.out.println(a + "->" + c);
        } else {
            //如果有多个盘,可以看成两个,最下面和最上面的所有盘(num-1)
            // (1)先移动上面所有的盘到b,借助c
            move(num - 1, a, c, b);
            // (2)把最下面的这个盘,移动到c
            System.out.println(a + "->" + c);
            // (3)再把b塔的所有盘,移动到c,借助a
            move(num -1, b, a, c);
            a1 += 1;
        }
        return a1;
    }
}

以上代码中所使用到的是递归的解决方法,因为原题中是用到的三根柱子,我在程序中则使用字符“A”,"B","C"来代替了,move方法需要传递四个参数,num是汉诺塔的层数,字符“a”,"b","c"则对应的是汉诺塔问题中所给出的三根柱子;

进入到程序中,我们先进行判断,试想一下:当第一根柱子上只有一个圆盘时,我们是不是可以直接将圆盘从第一根柱子移动到第三根柱子呢?所以进入到move方法中,当判断到num的值为1时,则直接将圆盘从A移动到C,并打印出来;

当num不等于1时则会进入下面的else语句中,当执行

move(num - 1, a, c, b);

这段代码时,可以理解为,将第一根柱子上的圆盘一次拿少一个,放置到第二根柱子中,但这过程中是借助到第三根柱子的,然后接着往下打印出将圆盘移动到第三根柱子时的过程,完成最后一个盘移动到C柱的过程,再然后再把B塔的所有盘移动到C,最后的变量a1不过是完成移动次数的计数,最后返回就好

最后完成main方法的编写,运行程序结果如下:

可以看出来,这已经是完成了, 这个问题就是单纯考察递归的使用,初学者可能会丈二和尚摸不着头脑,但多运用后就能灵活运用了,加油

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

语仄无言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值