/*
 * @Pedro Andres Ortega Mossos
 * @Codigo:  257076
 * @Grupo:   1
*/
 
 
 
import java.applet.Applet;
import java.awt.*;    
import java.awt.event.*;  

public class IS1 extends Applet implements ActionListener 
{	
  
	static long total = 0;
	static long npermut = 0;
	static double prob[] = new double[500];
	static int cases [] = new int[500];
	static int minCase=500;
	static int maxCase=0;
	static int n=4;
	Label prompt;     
  TextField input;   
  TextArea output;

	ScrollPane outputScrollPane;


 static int isortSteps(int aux[])
 {
	
		int steps = 0;
		int i,j,k,x;
		
		int v[] = new int[aux.length];
		for(i=0;i < v.length; i++) v[i]=aux[i];
		

		for(i=1;i < v.length; i++)
		{
		  x = v[i];
			j = i-1;
			
			
		  while( (j > -1)&& (v[j] > x)  ){
					v[j+1] = v[j];
					j--;	
					steps+=3;
					
			}
			steps++;
			
			v[j+1] = x;
			
			
		}
		steps += (4*v.length)-3;
		
		return steps;
		
	}
	

 static void swap (int v[], int i, int j) {
	int	t;

	t = v[i];
	v[i] = v[j];
	v[j] = t;
	}


static void perm (int v[],int x[], int i, int n) {

	
	int j = 0;	
	int k = 0;
	 
	
	if (i == n) {
			
			npermut++;
			
			
	  	k = isortSteps(x);
			total+=k;
			cases[k]++;
			
		
	} else
		
		for (j=0; j<n; j++) {

			

			x[i] = v[j];
			perm (v, x, i+1, n);

		
		}
}

	public void init()
   {
      prompt = new Label( "Enter n:" );
      add( prompt );  
      input = new TextField( 2 );
      input.setText(Integer.toString(n));
			add( input );   
      
      input.addActionListener( this );
      
      output = new TextArea();
		add(output);
   }

   
   public void actionPerformed( ActionEvent e )
   {
      
      n = Integer.parseInt( e.getActionCommand() );
     	input.setText(Integer.toString(n));  
     	repaint();
     	
   }
		
	
	
	
	public void paint(Graphics g) {
		
		int k = 0;
	 	int v[] = new int[n];
	 	int x[] = new int[n];
		total = 0;
		npermut = 0;
		minCase=500;
		maxCase=0;
		prompt.setLocation(155, 10);
		input.setLocation(220, 10);
		output.setText("");
		output.setBounds(400, 50, 200, 280);	
		
		for(k=0; k<500; k++) {
			cases[k] = 0;
		}
		
		for(k=0; k<n; k++){
				v[k]=k+1;
		} 
		
		perm(v,x,0,n);
  	
		for(k=0; k<500; k++){
					prob[k] = (double)cases[k]/  (double)npermut;
					if (( cases[k] != 0) && (minCase > k)) minCase = k;
					if (( cases[k] != 0) && (maxCase < k)) maxCase = k;
					
					
		}
	
		
		int i = 0;
		
		g.setColor(Color.black);
		g.drawString("Probability",10,50);
		g.drawString("Steps",350,340);
		g.drawString("n = "+n,155,50);
		g.drawString("Number of permutations = "+ npermut,155,65);
		g.drawString("Average number of steps =  " + +((double) total)/((double)npermut) ,50,380);
		
		int y = 80;
		for(i=minCase; i <= maxCase; i++) {
			if ( cases[i] != 0){
				y += 15;
				output.append("P("+i+")="+prob[i]+" ["+cases[i]+"]\n");
			}
		}
		
		g.setColor(Color.red);
		g.drawLine(50,50,50,320);
		g.drawLine(50,320,350,320);	
		
		g.setColor(Color.black);
		
		g.drawString("1.0", 10, 70);
		g.drawString("0.8", 10, 120);
		g.drawString("0.6", 10, 170);
		g.drawString("0.4", 10, 220);
		g.drawString("0.2", 10, 270);
		g.drawString("0.0", 10, 320);
		
		int yf;
		int shift = (int) (200.0/(double)(maxCase-minCase+1));
		int ishift = (int) (100.0/(double)(maxCase-minCase+1));
		g.setColor(Color.blue);
		for (i=minCase; i< (maxCase+1); i=i+1){
		  yf = (int) (prob[i] *250.0) ;
			g.fillRect(50+((i-minCase)*shift),320-yf, shift, yf);
			g.drawString(""+i,50+ishift+((i-minCase)*shift) , 330);
		
		}
		
		
	}		
	
	
}


