我采用的是逆推的思想,在最后一块当前是单独的一部分,其他为另外一部分,无论多少我们都可以分为两部分。
当只有一个盘子的时候
我们可以直接把盘子移动到C盘
当只有两个盘子的时候
当有两个的时候我们可以这样实现最短路径到C盘
//上面部分的处理方式
move(num-1, a, c, b);
//借助C盘进行转移到B盘,但是因为我们上面部分只有一块,
//所以我们不用借助C盘了,可以直接转移到B盘
// (2) 这个是移动下面部分的
System.out.println(a + "->" + c);
// (3) 再把 b塔的所有盘, 移动到 c,借助a塔
move(num - 1, b, a, c);
当盘子有三个的时候
先分成两部分,优先把最下面的定位到C盘,然后在处理上面部分
处理上面两个时,因为在上面的时候我们最后移动到B盘,我们以B盘为主,那我们就要以C盘为辅进行转移。
三个也可以像二个一样进行分析。多个也一样。
// num表示要移动的个数, a, b, c 分别表示A塔, B塔, C塔
public void move(int num, char a, char b, char c) {
// 如果只有一个盘 num = 1
if(num == 1) {
System.out.println(a + "->" + c);
} else {
// 如果有多个盘,可以看成两个,最下面的和上面的所有盘(num - 1)
// (1) 先移动上面所有的盘到 b, 借助 c
move(num-1, a, c, b);
// (2) 把最下面的这个盘,移动到 c
System.out.println(a + "->" + c);
// (3) 再把 b塔的所有盘, 移动到 c,借助a塔
move(num - 1, b, a, c);
}
}
主要思想就是分成两部分,这样就很好分析了。