汉诺塔要求
有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置N个圆盘。目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
分治思思想
1、如果汉诺塔上只有一个圆盘,则直接将A盘移动到C盘则完成。
2、如果有两个盘,则需要分三步完成
(1)A -> B
(2)A -> C
(3)B -> C
3、当n>=2时,无论多少个圆盘都看成两个盘,最下面的那个为单独的一个,其余所有盘为一个,采用递归算法解决。
代码
public class HanoiTower {
public static void main(String[] args) {
hanoiTower(3, "A", "B", "C");
}
/**
* 采用分治算法 无论多少个圆盘都看成两个盘,
* 最下面的那个为单独的一个,其余所有盘为一个,采用递归算法解决
* @param cnt 圆盘的个数
* @param A 柱子A
* @param B 柱子B
* @param C 柱子C
*/
public static void hanoiTower(int cnt, String A,String B,String C){
// 如果只有一个盘,将圆盘从A柱 移动到 C柱
if (cnt == 1){
System.out.println("将第 " + cnt + " 个盘从 "+A+" 柱移动到 "+C+" 柱" );
}else {
// 将第A柱上一个移动到B柱子,中间存放用
hanoiTower(cnt-1, A, C, B);
System.out.println("将第 " + cnt + " 个盘从 "+A+" 柱移动到 "+C+" 柱" );
// 此时A柱最底层的第一个已经在C柱,最后将B柱子上的移到到C柱子,完成移动
hanoiTower(cnt-1, B, A, C);
}
}
}