import Prog1Tools.IOTools;

public class HanoiSiRe {


   public static class Rahmen {
     public String quelle;
     public String hilf;
     public String ziel;
     public int n;
     public boolean ausgabe;
     public String text;
   }

   public static class Keller {
     public Rahmen[] inhalt;
     public int kopf;

     public boolean leer() {
       //System.out.println("Prüfen, ob Keller leer");
       if (kopf<0)
         return true;
       else
         return false;
     }

     public Rahmen lies() {
       //System.out.println("Lesen oberstes Kellerelement");
       if (leer()) {
         System.out.println("Lesen nicht möglich, Keller leer");
          return null;
       }
       else {
         return inhalt[kopf];
       }
     }

     public void loesche() {
       //System.out.println("Löschen oberstes Kellerelement");
       if (leer()) {
         System.out.println("Löschen nicht möglich, Keller leer");
       }
       else {
         inhalt[kopf] = null;
         kopf--;
       }
     }

     public void speichern(Rahmen r) {
       //System.out.println("Speichern neues Kellerelement");
       kopf++;
       inhalt[kopf] = new Rahmen();
       inhalt[kopf].quelle = r.quelle;
       inhalt[kopf].hilf = r.hilf;
       inhalt[kopf].ziel = r.ziel;
       inhalt[kopf].n = r.n;
       inhalt[kopf].ausgabe = r.ausgabe;
       inhalt[kopf].text = r.text;
       //System.out.println("ausgabe = " + r.ausgabe);
     }
   }


   public static void main(String[] args) {

     int anz_scheiben;
     Keller k;
     Rahmen r,p;

     anz_scheiben = IOTools.readInteger("Anzahl der Scheiben: ");
     if (anz_scheiben < 1){
      System.out.println("Fehler");
       return;}
     k = new Keller();
     k.inhalt = new Rahmen[3*anz_scheiben];
     p = new Rahmen();

     k.kopf = 0;

     k.inhalt[0] = new Rahmen();     // Hier wird der erste Rahmen gabaut. 
     k.inhalt[0].quelle = "Stab 1";  // und in den Keller getan. 
     k.inhalt[0].hilf = "Stab 2";    // Hier speichern(p) nehmen. 
     k.inhalt[0].ziel = "Stab 3";
     k.inhalt[0].n = anz_scheiben;
     k.inhalt[0].ausgabe = false;
     k.inhalt[0].text = "" ;
    //
    //
     while (k.kopf>=0) {  // While Schleife solange Keller nicht leer. 

         r = k.lies();
         k.loesche();     // Hier ist am Anfang der Keller leer, was soll's.
        //
        //
        if (r.ausgabe == true) {
                            System.out.println(r.text);
                            continue ;}
        //
        //
        //
       if (r.n < 1) {
            System.out.println("Fehler, Anzahl Scheiben wird <1");
	    return; }
       //
       if (r.n == 1) { // Bauen neuen Rahmen mittels r und speichern ihn.
         // 
          r.ausgabe = true;
	  r.text = " Scheibe 1 von " +  r.quelle + " nach " +  r.ziel; 
          k.speichern(r); continue;}
       //
       //
       //
       // 
       if (r.n > 1) { // Fuege  3 neue Rahmen in den Speicher ein. 
           p.quelle = r.hilf;
	   p.hilf = r.quelle;
	   p.ziel = r.ziel;
           p.n = r.n - 1;
           p.ausgabe = false;
	   p.text = " ";
           k.speichern(p);
       //
           p.ausgabe = true;
           p.text = "Scheibe " + r.n + " von " + r.quelle 
	                             + " nach " + r.ziel ;
           k.speichern(p);
       //
           p.quelle = r.quelle;
	   p.hilf = r.ziel;
           p.ziel = r.hilf;
           p.n = r.n -1; 
           p.ausgabe = false;
           p.text = " "; 
           k.speichern(p);
       }
       //
       // Hier ist das Fuellen des Kellers abgeschlossen.  
       // Und wir komen zum naechsten Lauf. 
     }
    }
   }


