黑马程序员技术交流社区

标题: 求教:用Java编程解决汉诺塔问题。 [打印本页]

作者: 飞鸟青崖    时间: 2013-6-2 10:59
标题: 求教:用Java编程解决汉诺塔问题。
本帖最后由 飞鸟青崖 于 2013-6-2 15:48 编辑

注意:汉诺塔中的圆盘个数不定,初始所在的柱子也不定,要移动到的柱子也不定。这三者都是由键盘输入的。
作者: HM张博文    时间: 2013-6-2 11:12
  1. import ds_java.*;

  2. public class HanoiTower {

  3. static int count=0;
  4. private int column;         //容量
  5. private Tower origin;         //起始地点
  6. private Tower median;         //中介地点
  7. private Tower endure;         //最终地点

  8. class Tower{                     //内类,定义一个塔
  9. IntStack load;
  10. String name;
  11. public Tower(int n,String na){
  12. load=new IntStack(n);
  13. name=na;
  14. }
  15. }

  16. public HanoiTower(int column){
  17. this.column=column;
  18. origin=new Tower(column,"A");
  19. median=new Tower(column,"B");
  20. endure=new Tower(column,"C");
  21. for(int i=column;i>0;i--)
  22. origin.load.push(i);
  23. origin.load.output();       
  24. }

  25. public HanoiTower(int n,Tower a,Tower b,Tower c){
  26. column=n;
  27. origin=a;
  28. median=b;
  29. endure=c;
  30. }

  31. public static void main(String[] args) {
  32. HanoiTower hanoi=new HanoiTower(15);
  33. hanoi.move();
  34. hanoi.endure.load.output();
  35. }

  36. private static void shift(Tower a,Tower b){       //从塔a中移到b中
  37. if(!a.load.isEmpty()&&!b.load.isFull()){
  38. int trp=a.load.pop();
  39. if(b.load.isEmpty()||b.load.get()>=trp){
  40. b.load.push(trp);
  41. System.out.println(trp+": from "+a.name+" to "+b.name);
  42. System.out.println(++count);
  43. }
  44. }
  45. }

  46. public void move() {                             //递归求汉诺塔问题
  47. if(column==1)
  48. shift(origin,endure);
  49. if(column>1){
  50. new HanoiTower(this.column-1,this.origin,this.endure,this.median).move();
  51. shift(origin,endure);
  52. new HanoiTower(this.column-1,this.median,this.origin,this.endure).move();
  53. }

  54. }       
  55. }
复制代码

作者: 风云    时间: 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