标签:无法 middle 直接 方法 system 目标 return vat 中间
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、 由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在 移动过程中三根杆上都始 终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
因为无法直接从题目中获得思路,所以采用数学归纳法进行推导
让n为当前层数上的圆盘编号,当n=1的时候:
??圆盘1直接从A到C
当n=2的时候:
??圆盘1需要从A到B
??圆盘2需要从A到C
??圆盘1需要从B到C
?其中B作为中间柱被使用过一次
当n=n的时候(将n-1看为一个整体):
?? A. A上的n-1个圆盘需要从A移动到B(借助于C)
?? B. 圆盘n需要从A到C
?? C. B上的n-1个圆盘需要从B到C (借助于A)
??当步骤为A的时候:
????1. 将A上的n-2个圆盘移到C上。
????2. 将A上的第n-1个圆盘移到B。
????3. 将C上的n-2个圆盘移到B。
??当步骤为C的时候:
????1. 将B上的n-2个圆盘移到A。
????2. 将B上的第n-1个盘子移到C。
????3. 将A上的n-2个圆盘移到C。
所以从上面可以分析出来,当n>=2的时候可以分为三个步骤:
(A为初始位置,C为中间位置,B为目的位置)(B为初始位置,A为中间位置,C为目的位置)可以创建方法:
/**
* @param layer 层数
* @param init 初始位置
* @param middle 中间位置
* @param target 目标位置
* @return void
*/
private static void solve(int layer, String init, String middle, String target) {
if (1 == layer) {
System.out.printf("%d从%s移动到%s;\n", layer, init, target);
} else {
solve(layer - 1, init, target, middle); //1.
System.out.printf("%d从%s移动到%s;\n", layer, init, target); //2.
solve(layer - 1, middle, init, target); //3.
}
}
方法说明
将n转移到目标位置,按规矩n转移没有借助中间位置,所以默认他很自觉,自己到目的位置,直接System.out.printf("%d从%s移动到%s;\n", layer, init, target);
将(1~n-1)从中间位置转移到目标位置,原理同说明1
标签:无法 middle 直接 方法 system 目标 return vat 中间
原文地址:https://www.cnblogs.com/huizhipeng/p/12050540.html