/*
       Towers of Hanoi for Jeliot
       
       This algorithm mainly demonstrates how Jeliot's
       Rstack data type can be used. It also shows a
       way to give textual output.
       
       I like to visualize the algorithm by showing only
       the stacks on the stage. Properties for them:
       Common:   Placement:   User
                 Y:           0.45
                 Width:       0.15
                 Height:      0.50
                 Color:       Green
                 Value type:  Scaling Box (from Advanced)
                 
       left:     X:           0.05
       
       center:   X:           0.30
       
       right:    X:           0.55
       
       Other properties can be left as they are by default.
       
       This is not the only way to visualize the algorithm,
       but can get you started.               
*/
       
import java.awt.*;

public class Hanoi extends java.applet.Applet {
    List messages = new List();

    Rstack left = new Rstack();
    Rstack center = new Rstack();
    Rstack right = new Rstack();
    
    public void init() {
       GridLayout gl = new GridLayout(1,1,0,0);
       setLayout(gl);
       add(messages);
       validate();
       show();
    }
    
    public void start() {
	solve(5);
    }
    
    protected void solve(int disks) {
        messages.addItem("Solving for "  + disks  + " disks.");
        messages.addItem("Setting up....");         
    	for (int i = disks ; i > 0 ; i--)
    	   left.push(i);
    	messages.addItem("Solving:");
    	Hanoi(0,1,2,disks);
    	messages.addItem("All done!");
    }
    
    protected void Hanoi(int src, int aux, int dest, int n) {
    	int disk = 0;
    	if (n > 0) {
    	   Hanoi(src, dest, aux, n-1);
    	   messages.addItem("Disk "+ n +" from peg "+src+" to "+dest+".");
    	   switch (src) {
    	      case 0: 
    	         disk = (int) left.pop();
    	         break;
    	      case 1:
    	         disk = (int) center.pop();
    	         break;
    	      case 2:
    	         disk = (int) right.pop();
    	   }
    	   switch (dest) {
    	      case 0: 
    	         left.push(disk);
    	         break;
    	      case 1:
    	         center.push(disk);
    	         break;
    	      case 2:
    	         right.push(disk);
    	   }
    	   Hanoi(aux, src, dest, n-1);
    	}
    }
    
}

