问题: 将A塔的所有盘子移动到C塔,期间可借助B塔,但一直要保证大盘下,小盘上
使用java写了分治算法,化大为小,分而治之,加上递归,便可轻松解决这个问题!
static int step = 0;
public static void main(String[] args) {
System.out.println("默认所有盘子在 A 塔,从上到下编号依次为1~8");
System.out.println("------------------------------------");
hanoiTower(8, 'A', 'B', 'C');
System.out.println("-------------------------");
System.out.println("一共需要走: " + step + " 步");
}
/**
* @param num 盘子数
* @param A 放在 a 盘的塔
* @param B 放在 b 盘的塔
* @param C 放在 c 盘的塔
*/
public static void hanoiTower(int num, char A, char B, char C) {
//只有一个盘时直接: A -> C
if (num == 1) {
System.out.println("第" + (++step) + "步:将编号为 1 的盘从 " + A + " 移动到 " + C);
} else {
// 上面所有盘先 A -> B,递归时借助 C
hanoiTower(num - 1, A, C, B);
// 然后最下面的盘移动到 C
System.out.println("第" + (++step) + "步:将编号为 " + num + " 的盘从 " + A + " 移动到 " + C);
//最后把 B -> C ,中间借助 A
hanoiTower(num - 1, B, A, C);
}
}
其中的代码逻辑注释中基本已经很清晰,当盘子数为8时,递归调用的逻辑如下结果所示:
PS:如有疑问,请联系21班李军