我只是四川理工学院的在校学生,听算法老师说汉洛塔至今还没有迭代算法,才产生兴趣写个这程序的。其中有什么不足的地方还希大家指教。
如果觉得写得还可以,帮我顶一下
package cn.suse;
 
 import java.util.LinkedList;
 
 public class Pillar {
  /**
   * 汉洛塔的柱子
   */
  private String name;
  private LinkedList<Integer> pillar=new LinkedList<Integer>();
  public boolean isMoveOutAble=false;
  public Pillar(String name) {
  super();
  this.name = name;
  }
  public String getName(){
  return name;
  }
  //搬出柱子的顶部盘子
  public Integer moveOut(){
  return pillar.pop();
  }
  //把搬入柱子
  public void moveIn(Integer i){
  pillar.push(i);
  }
  public void clear() {  
         pillar.clear();  
     }  
  //判断柱子的盘子是否是偶数,因为可以根据盘子的奇偶数确定移出的盘子放进哪根柱子
  public boolean isEvenCount(){
   int i=pillar.size();
   if(0==i%2){
   return true;
   }else{
   return false;
   }
  }  
  //返回柱子顶部的盘号,根据盘子大小判断谁能移出
     public int getTop(){
      if(0==pillar.size()){
      return Integer.MAX_VALUE;//如果为空就返回,一个无穷大的整数来,这样就不能搬出
      }
      return pillar.peekFirst();
     }
     //显示柱子上的所有盘号
     public void show(){
      System.out.print(name+":");
      for(Integer i:pillar){
      System.out.print(i+" ");
      }
      System.out.println("");
     }
 }
 
----------------------------------------------------------------------------------------------------------
package cn.suse;
 
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.util.Date;
 
 public class Hanoi {
 
  /**
   * 这是汉洛塔类,完成盘的搬运、显示工作
   */
  private Pillar pillarA = new Pillar("A");
  private Pillar pillarB = new Pillar("B");
  private Pillar pillarC = new Pillar("C");
  private int count;
  //初始化汉洛塔
  public boolean Init(int count) {
  pillarA.clear();
  pillarB.clear();
  pillarC.clear();
  pillarA.isMoveOutAble = true;
  if (count > 0) {
  for (int i = count; i > 0; i--) {
  pillarA.moveIn(i);
  }
  return true;
  }
  return false;
  }
  //这是一个工具方法,用于接收输入的盘个数
  public int getInputCount() {
  BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));  
  int i = 0;
  do {
  System.out.println("请输入1~64之间的圆盘数");
  try {
  String str = reader.readLine();
  i=Integer.parseInt(str);
  } catch (IOException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
  }
  } while (i < 1 || i > 64);//这里用于限制用户输入盘数
  return i;
  }
 //搬运盘子,注意里面函数的调用顺序是不能调换的,因getMoveInPillar函数中用的是搬出盘子后的数据
  public void move() {
  Pillar from = this.getMoveOutPillar();
  Integer i = from.moveOut();
  Pillar to = this.getMoveInPillar();
  to.moveIn(i);
  }
  //反回当前应搬出的柱
  public Pillar getMoveOutPillar() {
  if (pillarA.isMoveOutAble) {
  return pillarA;
  } else if (pillarB.isMoveOutAble) {
  return pillarB;
  } else {
  return pillarC;
  }
  }
 //用于计算出应搬入的盘号,同时通过setMovePillar函数计算出下一次应搬出的柱子
 //每次搬运前可以通过应搬出柱子上盘个数的奇偶确定应搬入的柱子,另外刚搬入的柱子下一次是不能搬出的。选出剩下的两个柱子中顶部的盘号小的作为下一次搬出的柱子,如果柱子没有盘子视为无穷大。
  public Pillar getMoveInPillar() {
  if (pillarA.isMoveOutAble) {
  if (pillarA.isEvenCount()) {
  pillarB.isMoveOutAble=false;
  this.setMovePillar(pillarA, pillarC);
  return pillarB;
  } else {
  pillarC.isMoveOutAble=false;
  this.setMovePillar(pillarA, pillarB);
  return pillarC;
  }
  } else if (pillarB.isMoveOutAble) {
  if (pillarB.isEvenCount()) {
  pillarC.isMoveOutAble=false;
  this.setMovePillar(pillarA, pillarB);
  return pillarC;
  } else {
  pillarA.isMoveOutAble=false;
  this.setMovePillar(pillarC, pillarB);
  return pillarA;
  }
  } else {
  if (pillarC.isEvenCount()) {
  pillarB.isMoveOutAble=false;
  this.setMovePillar(pillarA, pillarC);
  return pillarB;
  } else {
  pillarA.isMoveOutAble=false;
  this.setMovePillar(pillarC, pillarB);
  return pillarA;
  }
  }
  }
  //用于计算出下一次应搬出的柱子
  public void setMovePillar(Pillar first,Pillar next){
  int f=first.getTop();
  int n=next.getTop();
  if(f<n){//选出两者中顶部最小的作为下一次搬运的盘
  first.isMoveOutAble=true;
  next.isMoveOutAble=false;
  }else{
  first.isMoveOutAble=false;
  next.isMoveOutAble=true;
  }
  }
  //依次显示每个柱子上的盘号
  public void show() {
 
  pillarA.show();
  pillarB.show();
  pillarC.show();
  System.out.println("");
  }
 
  public static void main(String[] args) {
  // TODO Auto-generated method stub
  Hanoi hanoi = new Hanoi();
  int count = hanoi.getInputCount();
  System.out.println("开始初始化..........");
  hanoi.Init(count);
  System.out.println("完成初始化...........");
  System.out.println("A塔有" + count + "个圆盘搬到B塔 ,C为辅助塔");
  double totalCount = Math.pow(2,count)-1;
  hanoi.show();
  System.out.println("开始搬运,一共要搬运" + totalCount + "次");
  Date beginTime=new Date();
  for (; totalCount > 0; totalCount--) {
  hanoi.move();
  hanoi.show();
  }
  System.out.println("搬运结束..............");
  Date endTime=new Date();
  System.out.println("共搬运了 "+(endTime.getTime()-beginTime.getTime())+"毫秒。");
  }
 
 }