背景
闲来无事,想起来小时候玩的汉诺塔游戏。汉诺塔是将存放在A柱子上的8(可调整)个圆盘,挪移到C柱子上去
游戏规则
1、每次只能移动一个圆盘
2、大圆盘必须处于小圆盘的下方
核心算法
递归算法
核心思路
想要把8层汉诺塔从A位置挪移到C位置,需要拆解成以下三个步骤:
1、将上面7层移动到B位置
2、将第8层移动到C位置
3、将B位置的7层移动到C位置
这样就将8层汉诺塔,拆分成移动2次7层汉诺塔和一次A到C的圆盘移动;然后可以将7层汉诺塔移动再拆分成2次6层汉诺塔移动,直到0层汉诺塔移动;0层汉诺塔是无需移动的(递归算法的终止条件)
Java代码实现/**
- 汉诺塔游戏算法
*/
public class HanNuoTaGame {
public static Integer stepNum = 1;//移动步数
public static void main(String[] args) {
System.out.println("游戏开始");
HanNuoTaGame.hanNuoTa(6,"A","B","C");
System.out.println("游戏结束");
}
/**
* 汉诺塔迭代算法
* @param level 层级(有多少层圆盘)
* @param current 当前圆盘所在位置
* @param targer 想要移动的目标位置
* @param transfer 中转柱位置
*/
public static void hanNuoTa(Integer level,String current,String targer,String transfer){
/*
* 汉诺塔游戏核心思想是一个迭代算法:
* 圆盘是0个,即level=0时:无需移动
* 圆盘是N时,即level=N时:
* 1、将当前位N-1个圆盘移动到中转位置(递归算法)
* 2、将第N个圆盘移动到目标位置
* 3、将中转位的N-1个圆盘移动到目标位置(递归算法)
*/
if(level == 0){
//0级汉诺塔无需任何操作
}else{
//将当前位N-1个圆盘移动到中转位置(递归算法)
hanNuoTa(level-1,current,transfer,targer);
//将第N个圆盘移动到目标位置
System.out.println("第" + stepNum + "步,移动方法:"+current+" --> " + targer);
stepNum ++;
//将中转位的N-1个圆盘移动到目标位置(递归算法)
hanNuoTa(level-1,transfer,targer,current);
}
}
}
运行结果