题目描述
- 汉诺塔问题的改进。
- 有三根杆子A,B,C。A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小。要求按下列规则将所有圆盘移至C杆: 每次只能移动一个圆盘; 大盘不能叠在小盘上面。 提示:可将圆盘临时置于B杆,也可将从A杆移出的圆盘重新移回A杆,但都必须遵循上述两条规则。问具体应该怎样移动。
- 以上是经典的汉诺塔问题,现在修改一下移动的规则,不能从a塔直接移动到c塔,也不能直接从c塔直接移动到a塔,而是必须要经过中间的b塔。打印最优移动步数,以及最优移动总步数。
解题方法1
- 使用递归的方法解决。
- 如果只剩一个盘子需要移动,可以分两种情况讨论:
从塔a移动到塔b只需要一步,直接 a >> b 即可。从b到a,从b到c,从c到b同理只需要一步。
从塔a移动到塔c需要两步, a >> b and b >> c。同理从c到a也需要两步。
- 如果还剩k个盘子需要移动,仍然分两种情况讨论:
把k个盘子从塔a移动到塔b,需要三步,把前k-1个盘子从a移到c(交给递归),把第k个盘子从a移到b,把前k-1个盘子从c移到b(交给递归)。对于把k个盘子从b到a,从b到c,从c到b同理需要三步。
把k个盘子从a移到c,需要五步,把前k-1个盘子从a移到c,把第k个盘子从a移到b,把前k-1个盘子从c移到a,把第k个盘子从b移到c,把前k个盘子从a移到c。对于把k个盘子从c移到a同理需要五步。
- 代码如下:(设盘子从上到下命名为1-n)
public class Test {
public static void main(String[] args) {
hannuo(2,'a','b','c');
}
public static void hannuo(int n,char from,char mid,char to){
if(n==1){
if((from=='a' && to=='c') || (from=='c' && to=='a')){
System.out.println("盘子"+n+":"+from +" >> " + mid);
System.out.println(