问题描述:
汉诺塔问题是由很多放置在三个塔座上的盘子组成的一个古老的难题,如下图所示,所有的盘子的直径是不同的。并且盘子中央都有一个洞使得它刚好可以放在塔座上,所有的盘子刚开始都是在a座上,这个难题的目标是将左右的盘子都从塔座a,移到塔座c上,每次只可以移动一个盘子,并且任何一个盘子都不可以放置在比它小的盘子上,
链接:https://blog.csdn.net/qq_40688338/article/details/84837816
这是一个很明显的递归算法。
可以简单粗暴地把n个盘子的汉诺塔问题分成三步:
1、初始塔座a的n-1个盘子的通过中间塔座c放到目标塔座b上。
2、将塔座a下面最大的那个盘子直接从a放到目标塔座c上。
3、将塔座b的n-1个盘子通过中间塔座a放到目标塔座c上。、
代码分享:
package com.ethjava; //递归实现汉诺塔问题 ///** // * 汉诺塔问题 // * // * @param dish 盘子个数(也表示名称) // * @param from 初始塔座 // * @param temp 中介塔座 // * @param to 目标塔座 // */ public class hahuota { public static void main(String[] args) { hannuota(3, "a", "c", "b"); } public static void hannuota(int dish, String from, String to, String temp) { if(dish==1) { System.out.println("只有一个盘子,从"+from+"到"+to); }else{ hannuota(dish - 1, from, temp,to); System.out.println("移动盘子从,"+from+"到,"+to); hannuota(dish - 1,temp,to,from); } } } /* public class HanoiTower { public static void moveDish(int level, char from, char inter, char to) { if (level == 1) { System.out.println("从" + from + " 移动盘子" + level + " 号到" + to); } else { moveDish(level - 1, from, to, inter); System.out.println("从" + from + " 移动盘子" + level + " 号到" + to); moveDish(level - 1, inter, from, to); } } public static void main(String[] args) { int nDisks = 3; moveDish(nDisks, 'A', 'B', 'C'); } } */
运行结果:
只有一个盘子,从a到c
移动盘子从,a到,b
只有一个盘子,从c到b
移动盘子从,a到,c
只有一个盘子,从b到a
移动盘子从,b到,c
只有一个盘子,从a到c