汉诺塔问题

图解
本图以三个盘子为例来说明问题
在这里插入图片描述
代码实现

public class Hano {
/*
 * 假设现在64个盘子
 * 
 * 前63个 从x->y 借助z
 * 		前62个 从x->z 借助y
 * 			前61个 从x->y 借助z
 * 				.....
 * 			第62个 从x->z
 * 			前61个 从y->z 借助x
 * 				....
 * 		第63个 从x->y
 * 		前62个 从z->y 借助x
 * 			....
 * 第64个 从x->z
 * 前63个 从y->z 借助x
 * 		前62个 从y->x 借助z
 * 			...
 *  	第63个 从y->z
 *  	前62个 从x->z 借助y
 *  		...
 * */
	public static void main(String[] args) {
		int N=30;
		LinkedStack<Integer> stackX=new LinkedStack<>();
		for(int i=N;i>=1;i--){
			stackX.push(i);	//先让这些盘子进栈
		}
		LinkedStack<Integer> stackY=new LinkedStack<>();	//定义栈Y
		LinkedStack<Integer> stackZ=new LinkedStack<>();
		
		move(stackX,stackY,stackZ,N);	//用栈来实现移动盘子
		
		System.out.println(stackX);	//移动前X上的盘子
		System.out.println(stackZ);	//移动后Z上面的盘子
	}
	//x 源盘  y 借助盘  z目的盘
	private static void move(LinkedStack<Integer> x, LinkedStack<Integer>  y, LinkedStack<Integer>  z, int level) {
		if(level==1){	//level是盘子数
			z.push(x.pop());//先从X盘出栈,最后从Y盘进栈
		}else{
			move(x,z,y,level-1);	//X盘借助Z移动到Y盘
			z.push(x.pop());
			move(y,x,z,level-1);	//Y借助X移动到Z盘
		}
	}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值