汉诺塔
只有一个盘子的时候,从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
浙公网安备 33010602011771号