程序员面试经典--汉诺塔

3.4问题:

在经典汉诺塔中,有三根柱子以及N个不同大小的穿孔圆盘,盘子可以化入任意一根柱子。一开始,所有 盘子自底向上从大到小一次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时有以下限制:

  1、每次只能移动一个盘子;

  2、盘子只能从柱子顶端滑出移到下一根柱子;

  3、盘子只能叠在比它大的盘子上。

请运用栈,编写程序将所有盘子从第一根柱子移到最后一根柱子。

思想:

很自然的想到递归算法,在每一部分,我们都会执行一下步骤,用伪代码简述如下:

moveDisks(int n,Tower origin,Tower destination,Tower buffer){
	/*终止条件*/
	if(n<=0) return;
	
	/*将顶端n-1个盘子从origin移至buffer,将destination用作缓冲区*/
	moveDisks(n-1,origin,buffer,destination);
	
	/*将origin顶端的盘子移至destination,将origin用作缓冲区。*/
	moveDisks(n-1,buffer,destination,origin);
}

详细代码如下:

import java.util.*;
class HLTower{
	public static void main(String args[]){
		int n =3;
		Tower[] towers = new Tower[n];
		for(int i =0;i<3;i++){
			towers[i]=new Tower(i);
		}
		
		for(int i=n-1;i>=0;i--){
			towers[0].add(i);
		}
		towers[0].moveDisks(n,towers[2],towers[1]);
	}
}

class Tower{
	private Stack<Integer> disks;
	private int index;
	public Tower(int i){
		disks = new Stack<Integer>();
		index =i;
	}
	
	public int index(){
		return index;
	}
	
	public void add(int d){
		if(!disks.isEmpty()&&disks.peek()<=d){
			System.out.println("Error placing disk"+d);
		}else{
			disks.push(d);
		}
	}
	
	public void moveTopTo(Tower t){
		int top = disks.pop();
		t.add(top);
		System.out.println("Move disk:"+top+" from tower:"+index()+" to tower:"+t.index());
	}
	
	public void moveDisks(int n,Tower destination,Tower buffer){
		if(n>0){
			moveDisks(n-1,buffer,destination);
			moveTopTo(destination);
			buffer.moveDisks(n-1,destination,this);
		}
	}
}





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值