Hanoitower.java

~cpp 
public class HanoiTower {
    Tower towers[] = new Tower[3];

    public HanoiTower() {
        for(int i=0; i<3; i++)
            towers[i] = new Tower();
    }

    public void solve(int numOfDiscs) {
        for(int i=numOfDiscs; i>0; i--)
            towers[0].putOnDisc(i);

        moveDiscs(numOfDiscs, 0);
    }
    public void moveDiscs(int numOfDiscs, int from) {
        int to = (from==0)?1:0;

        if( numOfDiscs > 3 ) {
            moveDiscs(numOfDiscs-1, to);
        }
        else {
            towers[2].bringDisc(towers[from]);
            towers[to].bringDisc(towers[from]);
            towers[to].bringDisc(towers[2]);
            towers[2].bringDisc(towers[from]);
            towers[from].bringDisc(towers[to]);
            towers[2].bringDisc(towers[to]);
            towers[2].bringDisc(towers[from]);
        }
    }

    public boolean verifyAllDiscsAreMoved(){
        towers[2].showDiscs();
        return (towers[0].isEmpty() && towers[1].isEmpty() );
    }

}

Tower.java

~cpp 
import java.util.Vector;
import java.util.Enumeration;

public class Tower {
    Vector discsAtPillar = new Vector();

    public Tower() {
        System.out.println("Tower Created.");
    }
    public boolean isEmpty() {
        return discsAtPillar.isEmpty();
    }
    public boolean movable(Integer discNum){
        if( discsAtPillar.isEmpty() )
            return true;

        Object lastObj = discsAtPillar.lastElement();
        Integer iObj = (Integer)lastObj;

        if( iObj.intValue() > discNum.intValue() )
            return true;
        else
            return false;
    }

    public void putOnDisc(int discNum) {
        Integer i = new Integer(discNum);
        discsAtPillar.add(i);
    }

    public void removeTopDisc() {
        discsAtPillar.removeElementAt(discsAtPillar.size()-1);
    }

    public Integer getTopDisc() {
        Integer topDisc = (Integer)(discsAtPillar.lastElement());
        return topDisc;
    }

    public void showDiscs() {
        Enumeration enum = discsAtPillar.elements();
        while(enum.hasMoreElements()) {
            Integer i = (Integer)(enum.nextElement());
            System.out.println(i);
        }
    }

    public boolean bringDisc(Tower from) {
        Integer discNum = from.getTopDisc();

         if( movable(discNum) ) {
             // from 에서 꺼내와 this 에 넣는다.
             from.removeTopDisc();
            discsAtPillar.add(discNum);
            return true;
        }
        else {
             System.out.println("이동에러!");
            return false;
        }
    }
}
Retrieved from http://wiki.zeropage.org/wiki.php/HanoiProblem/임인택
last modified 2021-02-07 05:23:21