黑马程序员技术交流社区
标题:
求教:用Java编程解决汉诺塔问题。
[打印本页]
作者:
飞鸟青崖
时间:
2013-6-2 10:59
标题:
求教:用Java编程解决汉诺塔问题。
本帖最后由 飞鸟青崖 于 2013-6-2 15:48 编辑
注意:汉诺塔中的圆盘个数不定,初始所在的柱子也不定,要移动到的柱子也不定。这三者都是由键盘输入的。
作者:
HM张博文
时间:
2013-6-2 11:12
import ds_java.*;
public class HanoiTower {
static int count=0;
private int column; //容量
private Tower origin; //起始地点
private Tower median; //中介地点
private Tower endure; //最终地点
class Tower{ //内类,定义一个塔
IntStack load;
String name;
public Tower(int n,String na){
load=new IntStack(n);
name=na;
}
}
public HanoiTower(int column){
this.column=column;
origin=new Tower(column,"A");
median=new Tower(column,"B");
endure=new Tower(column,"C");
for(int i=column;i>0;i--)
origin.load.push(i);
origin.load.output();
}
public HanoiTower(int n,Tower a,Tower b,Tower c){
column=n;
origin=a;
median=b;
endure=c;
}
public static void main(String[] args) {
HanoiTower hanoi=new HanoiTower(15);
hanoi.move();
hanoi.endure.load.output();
}
private static void shift(Tower a,Tower b){ //从塔a中移到b中
if(!a.load.isEmpty()&&!b.load.isFull()){
int trp=a.load.pop();
if(b.load.isEmpty()||b.load.get()>=trp){
b.load.push(trp);
System.out.println(trp+": from "+a.name+" to "+b.name);
System.out.println(++count);
}
}
}
public void move() { //递归求汉诺塔问题
if(column==1)
shift(origin,endure);
if(column>1){
new HanoiTower(this.column-1,this.origin,this.endure,this.median).move();
shift(origin,endure);
new HanoiTower(this.column-1,this.median,this.origin,this.endure).move();
}
}
}
复制代码
作者:
风云
时间:
2013-6-2 13:04
class Test
{
public static void main(String[] args) {
String ta ="";
Scanner sc = new Scanner(System.in);
System.out.print("请输入个数:");
int num = sc.nextInt();
for(int x =1;x<=num;x++)//添加圆盘。
ta = ta+x;
System.out.println("请输入初始、终止位置,用甲、乙、丙来表示,并且逗号隔开:");
Scanner sc1 = new Scanner(System.in);
String s = sc1.nextLine();
String start = s.substring(0, s.indexOf(','));
String end = s.substring(s.indexOf(',')+1);
String[] str = {"甲","乙","丙"};//将三根柱子记为"甲","乙","丙"
jieGuo(ta,start,end,str);
}
private static void jieGuo(String ta, String start, String end, String[] str) {
String mid = "";
for(int x = 0;x<str.length;x++)//确定过渡柱子是哪一根。
if(!(str[x].equals(end))&&!(str[x].equals(start)))
mid = str[x];
if(ta.length()>0){
jieGuo(ta.substring(0, ta.length()-1),start,mid,str);//将上部分移动到过渡柱子
System.out.println(ta.charAt(ta.length()-1)+"移动到"+end);//将下部分移动到目的柱子
jieGuo(ta.substring(0, ta.length()-1),mid,end,str);//将上部分移动到目的柱子。
}
}
}
作者:
Sword
时间:
2013-6-2 14:44
如果问题已解决,请重新编辑帖子改为“已解决”,否则继续追问,谢谢合作!
关于把"未解决"的问题修改成"已解决"的说明 :
http://bbs.itheima.com/thread-49464-1-1.html
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2