汉诺塔

来源:互联网 发布:捡人软件 编辑:程序博客网 时间:2024/06/03 16:54

汉诺塔

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

解题思路

这里先把复杂的问题简单化。很多人举过这样的例子:如何把大象放进冰箱?

答案出乎意料的简单

  1. 打开冰箱门
  2. 放进大象
  3. 关闭冰箱门

那么这个问题我们先用一下数学归纳法
将三根柱子分别命名为:初始柱A(from)、辅助柱:B(inter)、目标柱:C(to)

如果只有1个盘子

  1. 从A移动1号盘到C。

如果有2个盘子

  1. 从A移动1号盘到B;
  2. 从A移动2号盘到C;
  3. 从B移动1号盘到C。

如果三个盘子的话

  1. 从A移动1号盘到C;
  2. 从A移动2号盘到B;
  3. 从C移动1号盘到B;
  4. 从A移动3号盘到C;
  5. 从B移动1号盘到A;
  6. 从B移动2号盘到C;
  7. 从A移动1号盘到C。

我们可以这么想

1、从A移动n-1个盘子移动到B
2、从A移动1号盘到C
3、从B移动n-1个盘到C

第一步:A(from),B(to),c(inter)
第二步:A(from),C(to)
第三步:B(from),A(inter),C(to)

代码实现

public class Dish {    public static void MoveDish(int leve ,String from,String inter,String to) {        if(leve == 1){ //如果只有一个盘子就退出迭代            System.out.println("从"+from+"移动1号盘到"+to);        }else{ //如果有大于一个盘子就继续迭代            MoveDish(leve-1, from, to, inter);            System.out.println("从"+from+"移动"+leve+"号盘到"+to+"");            MoveDish(leve-1, inter,from, to);        }    }    public static void main(String[] args) {        int dish = 3;        MoveDish(dish, "A", "B", "C");    }}

运行结果
运行结果

原创粉丝点击