首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

十分有意思的一道题目。敢不敢试试

2013-09-11 
非常有意思的一道题目。敢不敢试试。如图,要将A 柱上面的所有盘子,移动到C柱上面。(A柱上面的所有盘子,从小到

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


如图,要将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 Cmove 2 from A to Bmove 1 from C to Bmove 3 from A to Cmove 1 from B to Amove 2 from B to Cmove 1 from A to C


2、将A 柱上面的4个盘子移动到C柱  
调用方法 move( 4 , 'A' ,'B' , 'C');
结果应该如下:  
   
CSS code
move 1 from A to Bmove 2 from A to Cmove 1 from B to Cmove 3 from A to Bmove 1 from C to Amove 2 from C to Bmove 1 from A to Bmove 4 from A to Cmove 1 from B to Cmove 2 from B to Amove 1 from C to Amove 3 from B to Cmove 1 from A to Bmove 2 from A to Cmove 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方法


return x; //返回x

public int getY()//取得y方法 

return y; //返回y

public void 放置盘子(Disk 盘子,HannoiTower con) //定义一个有2个参数的"放置盘子"方法。参数是Disk类和HannoiTower类

this.con=con; //当前con等于参数con
con.setLayout(null); //调用on对象的方法setLayout,并设置为空
this.盘子=盘子; //当前盘子等于参数盘子
con.add(盘子); //con对象的add方法,加入"盘子"对象
int w=盘子.getBounds().width; //定义并给一个int类型的w变量一个值,值为"盘子.getBounds().width"
int h=盘子.getBounds().height; //定义并给一个int类型的h变量一个值,值为"盘子.getBounds().height"
盘子.setBounds(x-w/2,y-h/2,w,h);//调用"盘子"对象的setBounds方法,并把传递值
有盘子=true;//boolean类型的对象"有盘子"等于true 
con.validate(); //调用con对象的validate方法

public Disk 获取盘子() //定义"获取盘子"方法,方法返回Disk对象

return 盘子; //返回盘子

}

[解决办法]
程序猿威武,接分。
[解决办法]
汉诺塔问题,经典的用来介绍递归算法优势的问题。

不过我记得计算机竞赛中曾要求必须用 循环 来实现(也即禁止自定义函数、也不能用数组来模拟),不过还是高中的事情,现在是彻底忘了算法了。

不知道谁有印象的贴一贴?
[解决办法]
是滴,汉诺塔真是相当经典,淋漓尽致地展现了如何divide and conquer

而其前提是如何辨别是否可divide,将大问题分割成相似小问题,又如此循环往复。大问题与小问题之间存在的区别与联系。
在这里除了小问题的圆盘数比大问题少之外,其它都一样,包括起点柱,移动法则,终点柱。而这个数量会造成其它本质的差别吗?推测是不会。因为大问题本身又可以其它一个更大问题的小问题,所以大即是小,小即是大,除了数量无本质区别。
[解决办法]

探讨

汉诺塔问题,经典的用来介绍递归算法优势的问题。

不过我记得计算机竞赛中曾要求必须用 循环 来实现(也即禁止自定义函数、也不能用数组来模拟),不过还是高中的事情,现在是彻底忘了算法了。

不知道谁有印象的贴一贴?

[解决办法]
上面说反了,奇数时才是首先移到c柱
[解决办法]
探讨
这里有非递归
http://zhidao.baidu.com/question/102642853.html

[解决办法]
程序员真苦命
[解决办法]
汉诺塔问题。。。
[解决办法]
顶楼主 这个 游戏玩过但是没用代码写过
[解决办法]
河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)於1883年从泰国带至法国的,河内為越战时北越的首都,即现在的胡志明市;1883年法国数学家 Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。


Java code
/** * 河内塔算法 * 如果柱子标为ABC,要由A搬至C, * 在只有一个盘子子時,就將它直接搬至C,當有兩個盘子,就將B當作辅助柱。 * @author Administrator * */import java.io.*;public class Haoni {    public static void main(String args[]) throws IOException {        int n;        BufferedReader buf;        buf = new BufferedReader(new InputStreamReader(System.in));        System.out.print("请输入盘数:");        n = Integer.parseInt(buf.readLine());        Haoni hanoi = new Haoni();        hanoi.move(n, 'A', 'B', 'C');    }    public void move(int n, char a, char b, char c) {        if (n == 1)            System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);        else {            move(n - 1, a, c, b);/*将A上编号为1至n-1的圆盘移动到B上   C作为辅助*/            System.out.println("盘 " + n + " 由 " + a + " 移至 " + c);            move(n - 1, b, a, c);/*将B上编号为1至n-1的圆盘移动到C上    A作为辅助*/        }    }}
[解决办法]
递归问题,你分成2步来就很简单 然后一直递归
------解决方案--------------------


这个问题~~~年代久远

热点排行