汉诺塔问题求解
汉诺塔问题的描述如下:有A、B、C 3根柱子,在A上从下往上按照从大到小的顺序排列着64个圆盘,以B柱子为中介,把盘子全部移动到C 上。移动过程中,要求任意盘子的下面要么没有盘子,要么只能有比它大的盘子。下边为求解3阶汉诺塔问题的具体程序。在包ace中创建了一个HanoiTower类,然后在类中定义一个moveDish的方法,整个程序运用递归方法实现汉诺塔问题的求解。
一、第一种方式
package ace;
public class HanoiTower{
public static void moveDish(int level,char from,char inter,char to) {
if(level==1) {//如果只有一个盘子就退出迭代
System.out.println("从"+from+"移动盘子1号到"+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; //设置汉诺塔的阶数为3
moveDish(nDisks,'A','B','C');//实现移动算法
}
}
运行结果如下图所示
二、第二种方式
package ace;
public class HanoiTower{
public static void main(String[] args) {
hanoi(3, 'A', 'B', 'C');
System.out.println("ABC:小脑斧" );
}
/**
* 汉诺塔
* @param n n个盘子
* @param start 起始柱子
* @param transfer 中转柱子
* @param target 目标柱子
*/
public static void hanoi(int n, char start, char transfer, char target) {
//只有一个盘子,直接搬到目标柱子
if (n == 1) {
System.out.println(start + "---->" + target);
} else {
//起始柱子借助目标柱子将盘子都移动到中转柱子中(除了最大的盘子)
hanoi(n - 1, start, target, transfer);
System.out.println(start + "---->" + target);
//中转柱子借助起始柱子将盘子都移动到目标柱子中
hanoi(n - 1, transfer, start, target);
}
}
}
运行结果为:
A---->C
A---->B
C---->B
A---->C
B---->A
B---->C
A---->C
ABC:小脑斧