// Author : Apostolos Syropoulos apostolo@obelix.ee.duth.gr // Program : Non recursive solution to the towers of hanoi puzzle // Date : June 13, 1999 // import java.io.*; import java.math.*; public class hanoiF { static int moves=0; //number of moves so far static int getInt() { String line; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); try { line = in.readLine(); int i = Integer.valueOf(line).intValue(); return i; } catch (Exception e) { System.err.println("***Error: Input is not a number.\n" + "Input assumed to be the number 1"); return 1; } } static void hanoi(int height) { BigInteger ba, ac, cb, ab, bc, ca, m; int n; ba = new BigInteger("0"); ac = new BigInteger("0"); cb = new BigInteger("0"); ab = new BigInteger("0"); bc = new BigInteger("0"); ca = new BigInteger("0"); if ( height % 2 != 0 ) // N is odd { n = height-1; ba = new BigInteger("4"); ac = new BigInteger("5"); cb = new BigInteger("0"); m = new BigInteger("6"); } else /* N is even */ { n = height-2; ba = new BigInteger("134"); ac = new BigInteger("69"); cb = new BigInteger("73"); m = new BigInteger("216"); } while ( n > 2 ) { n--; ba = cb.add(m.multiply( new BigInteger("1").add(ac.multiply( new BigInteger("6"))))); ca = ba.add(m.multiply( new BigInteger("2").add(cb.multiply( new BigInteger("6"))))); bc = ac.add(m.multiply( new BigInteger("3").add( ba.multiply(new BigInteger("6"))))); m = new BigInteger("6").multiply(m.multiply(m)); n--; ba = ca.add(m.multiply( new BigInteger("4").add(bc.multiply( new BigInteger("6"))))); ac = bc.add(m.multiply( new BigInteger("5").add(ab.multiply( new BigInteger("6"))))); cb = ab.add(m.multiply(ca.multiply(new BigInteger("6")))); m = new BigInteger("6").multiply(m.multiply(m)); } if ( n == 2 ) { n--; ab = cb.add(m.multiply( new BigInteger("1").add(ac.multiply( new BigInteger("6"))))); bc = ac.add(m.multiply( new BigInteger("3").add(ba.multiply( new BigInteger("6"))))); m = new BigInteger("6").multiply(m.multiply(m)); } if ( n == 1 ) { ac = bc.add(m.multiply( new BigInteger("5").add(ab.multiply( new BigInteger("6"))))); } int k=0, total_moves=((int)Math.pow(2,height))-1; String[] moves = new String[total_moves]; BigInteger[] dAR; BigInteger r; while (ac.compareTo(new BigInteger("0")) != 0) { dAR = ac.divideAndRemainder(new BigInteger("6")); ac = dAR[0]; r = dAR[1]; if(r.compareTo(new BigInteger("0")) == 0) moves[k] = "CB "; else if(r.compareTo(new BigInteger("1")) == 0) moves[k] = "AB "; else if(r.compareTo(new BigInteger("2")) == 0) moves[k] = "CA "; else if(r.compareTo(new BigInteger("3")) == 0) moves[k] = "BC "; else if(r.compareTo(new BigInteger("4")) == 0) moves[k] = "BA "; else if(r.compareTo(new BigInteger("5")) == 0) moves[k] = "AC "; k++; } for (int i=k-1; i>=0; i--) { System.out.print(moves[i]); } } public static void main(String[] args) { long time1, time2; //for benchmarking int TowerHeight; System.out.println("Enter Tower height..."); System.out.print("?"); TowerHeight = getInt(); time1 = System.currentTimeMillis(); hanoi(TowerHeight); time2 = System.currentTimeMillis(); System.out.println(); System.out.print(time2-time1); //print execution time in msec System.out.println(" msec execution time"); } }