|
| 1 | +import java.util.Stack; |
| 2 | + |
| 3 | +/** |
| 4 | + * The discs differ in size and are initially arranged on one of the poles, |
| 5 | + * in order from largest (disc n) at the bottom to smallest (disc 1) at the top. |
| 6 | + * The task is to move the stack of discs to another pole, while obeying the following rules: |
| 7 | + * <p/> |
| 8 | + * Move only one disc at a time. |
| 9 | + * Never place a disc on a smaller one. |
| 10 | + * <p/> |
| 11 | + * Move the top N - 1 disks from Src to Aux (using Dst as an intermediary peg) |
| 12 | + * Move the bottom disk from Src to Dst |
| 13 | + * Move N - 1 disks from Aux to Dst (using Src as an intermediary peg) |
| 14 | + */ |
| 15 | +public class HanoiTower { |
| 16 | + public Stack<Integer> disks; |
| 17 | + public int index; |
| 18 | + |
| 19 | + public HanoiTower(int i) { |
| 20 | + index = i; |
| 21 | + disks = new Stack<Integer>(); |
| 22 | + |
| 23 | + } |
| 24 | + |
| 25 | + public void addDisk(int disk) { |
| 26 | + if (!disks.isEmpty()) { |
| 27 | + if (disks.peek() <= disk) { |
| 28 | + System.out.println("error: " + disk + " larger than " + disks.peek()); |
| 29 | + } |
| 30 | + } |
| 31 | + disks.push(disk); |
| 32 | + } |
| 33 | + |
| 34 | + public void printTower() { |
| 35 | + System.out.println("tower " + index + " : " + disks.toString()); |
| 36 | + } |
| 37 | + |
| 38 | + public void moveTopDisk(HanoiTower tower) { |
| 39 | + if (!disks.isEmpty()) { |
| 40 | + Integer disk = disks.pop(); |
| 41 | + tower.addDisk(disk); |
| 42 | + System.out.println("move disk " + disk + " from tower " + this.index + " to tower " + tower.index); |
| 43 | + } else { |
| 44 | + System.out.println("tower " + index + " is empty."); |
| 45 | + } |
| 46 | + } |
| 47 | + |
| 48 | + public void moveDisks(int n, HanoiTower dest, HanoiTower aux) { |
| 49 | + if (n > 0) { |
| 50 | + moveDisks(n - 1, aux, dest); |
| 51 | + moveTopDisk(dest); |
| 52 | + aux.moveDisks(n - 1, dest, this); |
| 53 | + } |
| 54 | + } |
| 55 | + |
| 56 | + public static void main(String[] args) { |
| 57 | + int N = 4; |
| 58 | + HanoiTower[] towers = new HanoiTower[N]; |
| 59 | + for (int i = 1; i <= N; i++) { |
| 60 | + towers[i - 1] = new HanoiTower(i); |
| 61 | + } |
| 62 | + for (int i = N; i > 0; i--) { |
| 63 | + towers[0].addDisk(i); |
| 64 | + } |
| 65 | + towers[0].printTower(); |
| 66 | + towers[0].moveDisks(N, towers[2], towers[1]); |
| 67 | + towers[2].printTower(); |
| 68 | + |
| 69 | + |
| 70 | + } |
| 71 | +} |
0 commit comments