public class TowersOfHanoi { /** * Returns a list of moves that will transfer some number of disks * from one peg to another peg while obeying the rules of a popular * variation of the Towers of Hanoi puzzle. * * @param fromPeg an integer in the set {0, 1, 2}. * @param toPeg an integer in the set {0, 1, 2}. * @param numDisks an integer greater than zero. */ public static List getMoves(int fromPeg, int toPeg, int numDisks) { List moves = new List(); if (numDisks == 1) { Move move = new Move(fromPeg, toPeg); moves.append(new Node(move)); } else // numDisks > 1 { int otherPeg = 3 - fromPeg - toPeg; List moves1 = getMoves(fromPeg, otherPeg, numDisks - 1); List moves2 = getMoves(fromPeg, toPeg, 1); List moves3 = getMoves(otherPeg, toPeg, numDisks - 1); return moves1.add(moves2).add(moves3); } return moves; } public static void main(String[] args) { int fromPeg = Integer.parseInt(args[0]); int toPeg = Integer.parseInt(args[1]); int numDisks = Integer.parseInt(args[2]); int moveNum = 0; List moves = getMoves(fromPeg, toPeg, numDisks); for (Node n = moves.head; n != null; n = n.next) { Move move = (Move) n.value; String s = ++moveNum + ". Move the top disk from peg "; s += move.fromPeg + " to peg " + move.toPeg + "."; System.out.println(s); } } } class Move { public final int fromPeg; public final int toPeg; public Move(int fromPeg, int toPeg) { this.fromPeg = fromPeg; this.toPeg = toPeg; } } class Node { public final Object value; public Node next = null; public Node(Object value) { this.value = value; } } class List { public Node head = null; public Node tail = null; public List append(Node node) { if (tail == null) { head = tail = node; } else { tail.next = node; tail = node; } return this; } public List add(List list) { this.append(list.head); this.tail = list.tail; return this; } }