汉诺塔问题:三根坚柱和一组中间有洞能在柱子上滑动的盘子,每个盘子有不同的直径。初始时,所有的盘子按照大小依次堆放在一个柱子上,最大的盘子在最下面。
目标:将所有的盘子从初始的第一根柱子移动到第三根柱子上,可以借用额外的第二根柱子作为临时存放盘子的地方,但是移动过程中必须遵守以下规则:
1.一次只能移动一个盘子
2.不能把大盘子压在小盘子上面
3.除去移动的瞬间,所有盘子必须在柱子上。
思想:递归。要将N个盘子移到目标柱子上:
(1)将N-1个盘子移动到额外的柱子上
(2)将最大的盘子移到目标柱子上
(3)将N-1个盘子从额外的柱子上移到目标柱子上
- package http;
- public class Tower {
- private int totalDisks;
- public Tower(int totalDisks){
- this.totalDisks=totalDisks;
- }
- public void solve(){
- moveTower(totalDisks,1,3,2);
- }
- private void moveTower(int numDisks,int start,int end,int temp){
- if (numDisks==1)
- moveOneDisk(start,end);
- else{
- moveTower(numDisks-1, start, temp, end);
- moveOneDisk(start,end);
- moveTower(numDisks-1,temp,end,start);
- }
- }
- private void moveOneDisk(int start,int end){
- System.out.println("将一个盘子从"+start+"移动到"+end);
- }
- }
- import http.Tower;
- public class SolveTower {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Tower towers=new Tower(4);
- towers.solve();
- }
- }