Computer Science 225
Advanced Programming
Spring 2017, Siena College
Hanoi BlueJ Project
Click here to download a BlueJ project for Hanoi.
Hanoi Source Code
The Java source code for Hanoi is below. Click on a file name to download it.
import java.util.Stack; /** * Example Hanoi: a demonstration of recursion to solve the Towers of Hanoi * problem. * * @author Jim Teresco, Siena College, Computer Science 225, Spring 2017 * */ public class Hanoi { /** the pins on which the discs sit */ private Stack<Integer> pins[]; /** the total number of discs */ private int numDiscs; /** * Construct an instance of the pins and discs for the given size problem * * @param numDiscs the number of discs to be moved during the game */ public Hanoi(int numDiscs) { this.numDiscs = numDiscs; pins = new Stack[3]; pins[0] = new Stack<Integer>(); pins[1] = new Stack<Integer>(); pins[2] = new Stack<Integer>(); for (int discSize = numDiscs; discSize >= 1; discSize--) { pins[0].push(discSize); } } /** * Solve the problem, moving the discs from pin 1 to pin 2 using pin 3 for intermediate storage * * @return the total number of discs moved */ public int solve() { print(); return solve(numDiscs, 0, 1, 2); } /** * Recursive method to move a given number of discs from a given pin to another, * using a thirds as the intermediate storage. * * @param numToMove number of discs that need to be moved * @param fromPin pin that contains the discs at the start * @param toPin pin that the discs should occupy at the end * @param usingPin pin available to use for intermediate storage * * @return the number of discs moved to accomplish the movement */ protected int solve(int numToMove, int fromPin, int toPin, int usingPin) { System.out.println("solve: move " + numToMove + " discs from pin " + fromPin + " to pin " + toPin + " using pin " + usingPin); // our base case is the movement of a single disc if (numToMove == 1) { int discToMove = pins[fromPin].pop(); System.out.println("Base case: move disc " + discToMove + " from pin " + fromPin + " to pin " + toPin + "."); pins[toPin].push(discToMove); print(); return 1; } // otherwise, we'll move all but the last off of fromPin to usingPin, then the one disc // from fromPin to toPin, then the ones we moved to usingPin onto toPin int moves = solve(numToMove - 1, fromPin, usingPin, toPin); int discToMove = pins[fromPin].pop(); System.out.println("Recursive case: move disc " + discToMove + " from pin " + fromPin + " to pin " + toPin + "."); pins[toPin].push(discToMove); print(); moves += solve(numToMove - 1, usingPin, toPin, fromPin); return moves + 1; } /** * Print an ASCII graphics representation of the current disc configuration. */ private void print() { for (int i = 0; i < 3; i++) { System.out.println("Pin " + i + ": " + pins[i]); } } /** * main method to solve a (text-based) instance of the Towers of Hanoi problem * for a given number of discs * * @param args the number of discs should be given in args[0] */ public static void main(String[] args) { int numDiscs = 0; // check for a parameter and that it's a number if (args.length != 1) { System.err.println("Usage: java Hanoi numDiscs"); System.exit(1); } try { numDiscs = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.err.println(args[0] + " could not be converted to an integer value."); System.exit(1); } Hanoi h = new Hanoi(numDiscs); int totalMoves = h.solve(); System.out.println("Done. Moved a total of " + totalMoves + " discs."); } }