汉诺塔问题

汉诺塔问题

问题描述:

1.有三根柱子,在其中一个柱子上,从上到下套着N个从小到大的盘子

2.要求把左边所有的盘子移动到右边

3.每次只能移动一个盘子

4.大盘子不能放置在小盘子之上
在这里插入图片描述
需要将左侧的盘子,按照大的在下,小的在上的规则,全部移动到右侧(如下)
在这里插入图片描述
把a柱的n个盘子移动到c柱需要几步:

1.把前n-1个盘子都移动到b柱

2.把最大的盘子(第n个)移动到c柱

3.把b柱上的n-1个盘子移动到c柱

Java实现代码

package com.xingyun.digui;

public class HanNoTa {
	/*
	 * 汉诺塔问题:
	 * 
	 */
	public static void main(String[] args) {
		hanNoTa(5, 'a', 'b', 'c');
	}

	/*
	 * 解决思路,一共分为两种情况,第一种是只有一个盘子,第二种是有多个盘子
	 */
	/**
	 * 
	 * @param n    盘子个数
	 * @param from 起始的柱子
	 * @param in   第二个柱子
	 * @param to   目标柱子
	 */
	/*
	 * 	整个过程一共分为3步,
	 * 	第一步,将除了最下面的一个盘子外,其他盘子都移动到中间位置的柱子上面
	 * 	第二步,将最后一个盘子移动到目标位置
	 * 	第三部,将中间位置上的所有盘子全部移动到目标位置
	 * 
	 * 	里面只是通过两次调用时参数的不同来改变每轮移动的起始位置和目标位置
	 * 	真正执行移动操作的时两个输出语句。
	 * */
	public static void hanNoTa(int n, char from, char in, char to) {
		//如果只存在一个盘子的时候,直接将整个盘子移动到目标位置
		if(n==1) {
			//如果存在多个盘子的时候,这里只完成最上面的一号盘子的移动
			System.out.println("第1个盘子从"+from+"移动到"+to);
		}else {
			//将所有的盘子移动到中间位置
			hanNoTa(n-1, from, to, in);
			//完成除去1号盘子之外的其他盘子的移动操作,
			System.out.println("第"+n+"个盘子从"+from+"移动到"+to);
			//将所有的盘子从中间位置移动到目标位置
			hanNoTa(n-1, in, from, to);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值