日期:2014-05-17  浏览次数:20948 次

非常有意思的一道题目。敢不敢试试。


如图,要将A 柱上面的所有盘子,移动到C柱上面。(A柱上面的所有盘子,从小到大排列)

要求:
  1、同时只能移动一个盘子
  2、只能将小的盘子放到大的盘子上面,不能将大的盘子放到小盘子上面
  3、实现下面的方法,完成盘子的移动
  /**
* @param topNs 盘子总数
* @param from 盘子原来所在的柱子
* @param inter 辅助用的柱子
* @param to 盘子要移动到的柱子
*/
public void move(int topNs , char from , char inter , char to );
   
  3、打印出每一步的移动信息。
 
例如:
1、将A 柱上面的3个盘子移动到C柱
调用方法 move( 3 , 'A' ,'B' , 'C');
 
结果应该如下:
   
CSS code

move 1 from A to C
move 2 from A to B
move 1 from C to B
move 3 from A to C
move 1 from B to A
move 2 from B to C
move 1 from A to C



2、将A 柱上面的4个盘子移动到C柱  
调用方法 move( 4 , 'A' ,'B' , 'C');
结果应该如下:  
   
CSS code

move 1 from A to B
move 2 from A to C
move 1 from B to C
move 3 from A to B
move 1 from C to A
move 2 from C to B
move 1 from A to B
move 4 from A to C
move 1 from B to C
move 2 from B to A
move 1 from C to A
move 3 from B to C
move 1 from A to B
move 2 from A to C
move 1 from B to C



------解决方案--------------------
这不就是 汉诺塔 问题么
------解决方案--------------------
汉诺塔,网上一大堆实现。

递归
Java code

    /**
     * @param topNs 盘子总数
     * @param from     盘子原来所在的柱子
     * @param inter     辅助用的柱子
     * @param to     盘子要移动到的柱子
     */
    public static void move(int topNs, char from, char inter, char to) {
        if (topNs == 1) {
            System.out.printf("move %s from %s to %s\n", topNs, from, to);
        } else {
            move(topNs - 1, from, to, inter);
            System.out.printf("move %s from %s to %s\n", topNs, from, to);
            move(topNs - 1, inter, from, to);
        }
    }

------解决方案--------------------
以前一直不会解这个题目,后来老师给了一句口诀,然后就很简单的会了:
老和尚先叫小和尚把上面的N-1个盘子搬到C柱,然后老和尚再把最后的盘子搬到C柱
------解决方案--------------------
看过《猩球崛起》吗?里面人类用大猩猩做实验就有这道题目。

看来,程序员还是没能逃脱猿猴的命运啊......
------解决方案--------------------
汉诺塔问题啊,递归解决
------解决方案--------------------
探讨

看过《猩球崛起》吗?里面人类用大猩猩做实验就有这道题目。

看来,程序员还是没能逃脱猿猴的命运啊......

------解决方案--------------------
B is temp ,

move num from A to B(所有) go 

move num from B to C

success
------解决方案--------------------
import java.awt.*; 
public class TowerPoint //公共类TowerPoint

int x,y; //定义2个int类型的变量
boolean 有盘子; //定义一个boolean类型的变量
Disk 盘子=null; //初始化一个对象"盘子"并赋值为空
HannoiTower con=null; //初始化一个HannoiTower类的对象"con"并赋值为空

public TowerPoint(int x,int y,boolean boo) //构造函数,有3个参数,x,y,boo

this.x=x; //将参数赋给当前x
this.y=y; //将参数赋给当前y

有盘子=boo; //将boo赋给"有盘子"

public boolean 是否有盘子() //定义一个返回boolean类型的方法"是否有盘子"

return 有盘子; //返回boolean类型的"有盘子"

public void set有盘子(boolean boo) //set方法,并且参数为boolean

有盘子=boo; //将boo赋给有盘子


public int getX() //取得x方法