下面介绍汉诺塔问题以及给出其求解方法和java代码。
n阶汉诺塔问题:假设有三个塔座,假设为x, y, z. 现在在x塔座上有n个直径各不相同的圆盘,且满足从下到上直径依次减小。问题是需要借助y塔座,将所有圆盘移动到z塔座,且不改变原有顺序。在移动时需要满足的规则是:
1.每次只能移动一个圆盘。
2.圆盘可以移动到x,y,z任何一个塔座。
3.任何时刻都应该满足下面的圆满的直径大于上面的圆盘的直径。
分析:(利用递归的思想)
如果n=1的时候,只需要直接将圆盘直接移动到目的塔座(这个可以看成结束递归的基本事件);当n>1的时候,只需将较小的n-1个圆盘移动到y塔座(辅助塔座),然后将最大的圆盘直接移动到目的塔座。知识后做大的圆盘在目的塔座,并且因为其是最大的并不会影响到其他圆盘的移动,所以可以将问题变为将n-1个圆盘从y塔座移动到z塔座(这时候x塔座变成辅助塔座)。利用同样的方法,先将n-2个直径较小的圆盘移动到辅助塔座,然后将n-1个圆盘中直径最大的圆盘移动到目的塔座,以此类推。。。结束的标志是剩余圆盘数等于1,然后直接移动到目的塔座即可。详细的java代码如下所示:
public class hannuo {
//by Allen 05-25-2017private int c = 0;
public void hannuo(int n, char x, char y, char z){
if (n == 1){
move(x, 1, z);
}
else {
hannuo(n - 1, x, z, y);
move(x, n, z);
hannuo(n - 1, y, x, z);
}
}
public void move(char x, int n, char z){
System.out.println("第" + ++c + "次移动:" + n + "号圆盘," + x + "->" + z);
}
public static void main(String[] args) {
hannuo h = new hannuo();
h.hannuo(4, 'x', 'y', 'z');
}
}