非常有意思的一道题目。敢不敢试试。
如图,要将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方法 {