汉诺塔问题

随声附和 提交于 2020-02-05 00:05:03

汉诺塔问题

问题描述:

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);
		}
	}
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!