Example 1
The following Java program prints a procedure for solving the traditional variation of the Towers of Hanoi puzzle.
public class TowersOfHanoi { /** * Returns a sequence of moves that solves the specified puzzle. * * @param n a non-negative integral number of disks * @param from a peg number in the set {0, 1, 2} * @param to a different peg number, also in {0, 1, 2} */ public static String solve1(int n, int from, int to) { if (n == 1) { return from + "," + to; } else { final int other = 3 - from - to, oneLess = n - 1; final String s1 = solve1(oneLess, from, other), s2 = solve1(1, from, to), s3 = solve1(oneLess, other, to); return s1 + "," + s2 + "," + s3; } } public static void main(String[] args) { final int n = Integer.parseInt(args[0]), f = Integer.parseInt(args[1]), t = Integer.parseInt(args[2]); System.out.print("[" + solve1(n, f, t) + "]"); } }
Example 2
The following program uses recursive methods to print the minimum number of moves required to solve variations of the Towers of Hanoi puzzle.
public class FewestMoves { public static void main(String[] args) { final String message = "The program FewestMoves expects two integer arguments\n" + "n and m, where n > 0 and m is in {1, 2}. The program\n" + "prints the minimum number of moves required to solve\n" + "variations of the Towers of Hanoi puzzle that entail\n" + "moving up to n disks from a peg to another peg that\n" + "is m moves away."; try { final int n = Integer.parseInt(args[0]), m = Integer.parseInt(args[1]); if (n > 0 && m > 0 && m < 3) { final String pad = " "; for (Integer i = 1; i <=n; i++) { Integer m1 = Puzzle.count1(i), m2 = Puzzle.count2(i, m), m3 = Puzzle.count3(i, m); String s0 = i.toString(), s1 = m1.toString(), s2 = m2.toString(), s3 = m3.toString(); System.out.println(s0 + pad.subSequence(0, pad.length() - s0.length()) + s1 + pad.subSequence(0, pad.length() - s1.length()) + s2 + pad.subSequence(0, pad.length() - s2.length()) + s3); } } else System.out.print(message); } catch (Exception e) { System.out.print(message); } } } class Puzzle { public static int count1(int n) { if (n == 1) return 1; else // n > 1 return 2 * count1(n-1) + 1; } public static int count2(int n, int m) { if (n == 1) return m; else if (m == 1) return count2(n-1, 2) + count2(n-1, 1) + 1; else // n > 1 and m is 2 return 2 * count2(n, 1); } public static int count3(int n, int m) { if (m == 2) return -1; // to do double a = Math.pow(1 + Math.sqrt(3), n+1), b = Math.pow(1 - Math.sqrt(3), n+1); double difference = a - b, product = 2 * Math.sqrt(3); double quotient = difference/product; return (int)Math.round(quotient - 1); } }
Example 3
The following Java program prints a procedure for solving the variation of the Towers of Hanoi puzzle where disks can only move from peg to adjacent peg in one direction around a circle of three pegs. The solution it prints is not optimal, but it gets the job done. You can do better.
public class TowersOfHanoi { /** * Returns a sequence of moves that solves the specified puzzle. * * @param n a non-negative integral number of disks * @param from a peg number in the set {0, 1, 2} * @param to a different peg number, also in {0, 1, 2} */ public static int distance(int from, int to) { if (to < from) to += 3; return to - from; } public static String solve3(int n, int from, int to) { final int m = distance(from, to); final int other = 3 - from - to, oneLess = n - 1; if (n == 1) { if (m == 1) return from + "," + to; else return from + "," + other + "," + other + "," + to; } else { if (m == 1) { final String s1 = solve3(oneLess, from, to), s2 = solve3(oneLess, to, other), s3 = solve3(1, from, to), s4 = solve3(oneLess, other, from), s5 = solve3(oneLess, from, to); return s1 + "," + s2 + "," + s3 + "," + s4 + "," + s5; } else { final String s1 = solve3(n, from, other), s2 = solve3(n, other, to); return s1 + "," + s2; } } } public static void main(String[] args) { try { final int n = Integer.parseInt(args[0]), f = Integer.parseInt(args[1]), t = Integer.parseInt(args[2]); System.out.print("[" + solve3(n, f, t) + "]"); } catch (Exception e) { System.out.println("Snap!"); } } }