求解汉诺塔问题

下面介绍汉诺塔问题以及给出其求解方法和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-2017
private 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');
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值