汉诺塔

只有一个盘子的时候,从pos1直接挪到pos3

1  public static void move(char pos1,char pos3) {
2         System.out.println(pos1+"->"+pos3+" ");
3     }

当有n个盘子的时候

n = 1: A->C        一次
n = 2: A->B  A->C  B->C    三次
n = 3: A->C  A->B  C->B  A->C  B->A  B->C  A->C    七次

不难发现,n个盘子时,移动次数为:2^n - 1

算法分析
              (1) 把n-1个盘子由A 移到 B;
    (2) 把第n个盘子由 A移到 C;
    (3) 把n-1个盘子由B 移到 C;
从这里入手,在加上上面数学问题解法的分析,我们不难发现,移到的步数必定为奇数步:
    (1)中间的一步是把最大的一个盘子由A移到C上去;
    (2)中间一步之上可以看成把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,
    (3)中间一步之下可以看成把B上n-1个盘子通过借助辅助塔(A塔)移到了C上;
1 public static void hanoi(int n,char pos1,char pos2,char pos3) {
2         if(n == 1) {
3             move(pos1,pos3);
4             return;
5         }
6         hanoi(n-1,pos1,pos3,pos2);//开始位置、中途转接位置、目的位置
7         move(pos1,pos3);
8         hanoi(n-1,pos2,pos1,pos3);//开始位置、中途转接位置、目的位置
9     }

输出验证:

1 public static void main(String[] args) {
2 
3         hanoi(1,'A','B','C');
4         System.out.println();
5         hanoi(2,'A','B','C');
6         System.out.println();
7         hanoi(3,'A','B','C');
8         System.out.println();
9     }

 


————————————————
版权声明:本文为CSDN博主「renlianggee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/renlianggee/java/article/details/89945824
posted @ 2020-04-29 16:09  听说在北郭  阅读(202)  评论(0)    收藏  举报