// Applet to solve the problem as posed by Roberto ;-)
// Kees Lemmens, October 1999

import java.util.*;
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class Roberto extends Applet implements ActionListener
{
   TextArea output;
   TextField nrteams, nrtables;
   
   public TextField number(String name, Panel parent, int size)
   {
      Panel panel  = new Panel();
      Label label  = new Label(name,Label.CENTER);
      TextField n  = new TextField("1",size);

      panel.add(label);
      panel.add(n);
      parent.add(panel);
      return n;
   }
   
   public void println(String string)
   {
      output.append(string + "\n");
   }
   
   public int getvalue(TextField number)
   {
      try
      {  return Integer.parseInt(number.getText()); }
      catch (NumberFormatException nf)
      {  return -1; }
   }
      
   public void actionPerformed(ActionEvent ev) // JDK 1.1
   {
      computeResult();
   }

   public Roberto()  // Constructor
   {
      createWidgets();
   }
   
   private void createWidgets()
   {
      // Frame frame=new Frame("Roberto");
      Applet frame = this;
      frame.setLayout(new FlowLayout()); 
      
      Panel inputs  = new Panel();
      Panel buttons = new Panel();
      
      nrteams  = number("Teams  :",inputs,6);
      nrtables = number("Tables :",inputs,6);
      
      Button start  = new Button("Compute");
      buttons.add(start);
      start.addActionListener(this);

      output = new TextArea(15,45);
      output.setEditable(false);
      
      frame.add(inputs);
      frame.add(buttons);
      frame.add(output);
      frame.setVisible(true);
   }
   
   // From this point on we start the computation itself :
   
   int n,m,o,t,c;
   int teamlock[][];
   int tabllock[]  ;
   int playlock[]  ;

   final static int FREE=0;
   final static int USED=1;
   
   private static void clearlockarray(int lock[][])
   {
      int m,n;
      for(n=0;n<lock.length;n++)
	for(m=0;m<lock[n].length;m++)
       lock[n][m]=FREE;
   }

   private static void clearlock(int lock[], int size)
   {
      int n;
      for(n=0;n<size;n++)
	lock[n]=FREE;
   }
   
   public void computeResult()
   {
      Random rand = new Random();  // init random generator seed
      
      int nrtab = getvalue(nrtables);
      int nrtms = getvalue(nrteams);
      
      teamlock = new int[nrtab][nrtms];
      tabllock = new int[nrtab];
      playlock = new int[nrtms];

      clearlockarray(teamlock);
      
      // constraint : 2x dezelfde tegenstander mag wel,  maar 2x dezelfde
      //              tafel mag niet !
      //               -> lock voor tafel geldt voor de hele run, maar
      //                  lock voor tegenstander geldt slechts voor een
      //                  enkel spel !
      

      println("\n Aantal tafels : " + nrtab + 
	      " Aantal teams  : " + nrtms + "\n");
      
      for(n=0;n<nrtab*2;n++)        // aantal spelronden : evenveel als tafels
      {
	 clearlock(tabllock,nrtab);   // geef alle tafels vrij
	 clearlock(playlock,nrtms);   // geef alle teams  vrij
	 
	 for(m=0;m<nrtms;m++) // zoek voor ieder team een tafel+tegenstander
	 {
	    if(playlock[m] == USED)
	      continue; // team already playing
	    else
	      playlock[m] = USED; // lock this team
	    
	    // zoek vrije EN nog niet gespeelde tafel en lock deze zowel
	    // als tafel (voor dit spel) als bij het betreffende team (voor de 
	    // gehele wedstrijd).
	    
	    t=0;
	    while(t < nrtab                && 
		  (tabllock[t]    == USED  || 
		   teamlock[t][m] == USED)) t++;
	    
	    if(t < nrtab)
	    {	 
	       tabllock[t]    = USED;
	       teamlock[t][m] = USED;
	    }
	    else
	      continue; // shouldn t happen : always more tables than pairs
	    
	    // Now search an opponent
	    o = 0;
	    c = 0; // limit the number of guesses
	    while(o < nrtms                 &&
		  (playlock[o]    == USED   ||
		   teamlock[t][o] == USED ) &&
		  c++ < 1000)
	      o = Math.abs(rand.nextInt()%nrtms); // o++;
	    
	    if(o < nrtms)
	    {
	       playlock[o]    = USED; // lock other team
	       teamlock[t][o] = USED;
	    }
	    else
	      continue;
	    
	    println("Spel " + n + " : tafel " + t +
		    " -> team1 = " + m + ", team2 = " + o);
	 }
      }

      println("");
   }

   /*
    public static void main(String argv[])
    {
       new Roberto();
    }
    */
}

