非常有意思的一道题目。敢不敢试试。
如图,要将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');
结果应该如下:
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
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
/** * @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柱
[解决办法]
看过《猩球崛起》吗?里面人类用大猩猩做实验就有这道题目。
看来,程序员还是没能逃脱猿猴的命运啊......
[解决办法]
汉诺塔问题啊,递归解决
[解决办法]
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,将大问题分割成相似小问题,又如此循环往复。大问题与小问题之间存在的区别与联系。
在这里除了小问题的圆盘数比大问题少之外,其它都一样,包括起点柱,移动法则,终点柱。而这个数量会造成其它本质的差别吗?推测是不会。因为大问题本身又可以其它一个更大问题的小问题,所以大即是小,小即是大,除了数量无本质区别。
[解决办法]
/** * 河内塔算法 * 如果柱子标为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步来就很简单 然后一直递归
------解决方案--------------------
这个问题~~~年代久远