JAVA求解汉诺塔问题


1、提出问题

首先,我们来了解一下,什么是汉诺塔问题。

汉诺塔问题,又被成为河内塔问题,来自于古印度的一个传说中的益智玩具。不知道大家有人看过《猩球崛起》这部电影没有,电影中的那个猩猩,摆弄的东西就是汉诺塔玩具。这个玩具一共有三根柱子,在其中的一个柱子上,从上到下,从小到大防着n个盘子。玩法是,要求将这个柱子上的盘子全部移到另外的一根柱子上,但是,要求在上面的盘子不能比下面的盘子大,可以借助第三根柱子。

好了,问题来了,我们如何用程序求解,当需要搬走n个盘子,一共需要多少步?

2、分析问题

如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C。假设我们现在只需要搬走两个盘子,就将B当作辅助柱。我们可以模拟如下场景:

JAVA求解汉诺塔问题_第1张图片

如果盘数超过2个,将第三个以下的盘子用物体遮住,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤而被遮住的部份。那么,我们的第三个盘子该怎么办呢?实际上,我们可以将上面的两个盘子,看做是一个盘子,那么,程序实际上进入了递归处理的过程。



3、解决代码

根据上面的代码,我们可以得到下面的JAVA代码:

import java.io.*;

public class Hanoi {
    public static void main(String args[]) throws IOException {
        int n;
        BufferedReader buf;
        buf = new BufferedReader(new InputStreamReader(System.in));

        System.out.print("请输入盘数:");
        n = Integer.parseInt(buf.readLine());

        Hanoi hanoi = new Hanoi();
        hanoi.move(n, 'A', 'B', 'C');
    }

    public void move(int n, char a, char b, char c) {
        if(n == 1)
            System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);
        else {
            move(n - 1, a, c, b);
            System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);
            move(n - 1, b, a, c);
        }
    }
}


4、结论

汉诺塔问题,是算法中的经典问题,也是递归中的经典问题。可以说,每一个想要深刻理解递归的人,都必须对汉诺塔问题了如指掌。本篇代码没有太多的注释,但是说明已经很清楚了。对于不能理解的同学,建议将n设置为3,将整个程序的逻辑,完整的自己演示一遍。

你可能感兴趣的:(JAVA常用算法分析,java,数据结构,算法)