/* serveur Puissance 6 - Royale */

#include <stdio.h>
#include <stdlib.h>
#include <sys/times.h>
#include <signal.h>

#define COTE 20
#define PUISSANCE 6
#define TIMEOUT 1

typedef int Tgrille[COTE][COTE];

#define GO \
if (grille[i][j]==cur) \
  { if ((cur!=0)&&(++nb==PUISSANCE)) return(cur); } \
else { cur=grille[i][j]; nb=1; }

int gagnant(Tgrille grille)
{
  int i,j,k,cur,nb;
  for (j=0;j<COTE;j++)
  {
    cur=-1;
    for (i=0;i<COTE;i++) GO
  }
  for (i=0;i<COTE;i++)
  {
    cur=-1;
    for (j=0;j<COTE;j++) GO
  }
  for (k=PUISSANCE-COTE;k<COTE-PUISSANCE+1;k++)
  {
    cur=-1;
    for (i=0;i<COTE;i++)
    {
      j=k+i;
      if ((j>=0)&&(j<COTE)) GO
    }
  }
  for (k=PUISSANCE-1;k<COTE*2-PUISSANCE;k++)
  {
    cur=-1;
    for (i=0;i<COTE;i++)
    {
      j=k-i;
      if ((j>=0)&&(j<COTE)) GO
    }
  }
  return(0);
}

int autre(int joueur)
{
  if (joueur==1) return(2); else return(1);
}

int main(int argc, char **argv)
{
  FILE *input[3];
  FILE *output[3];
  Tgrille grille;
  int tour,joueur=1,i,j,x,y,temps[3]={0,0,0};
  struct tms buf;

  void sig_handler(int s)
  {
    /* s est le numéro du signal ayant déclenché l'appel à la fonction */
    /* on ré-arme de le handler */
    /*  signal(s, sig_handler);*/
    /* opérations de traitement du signal */
    temps[joueur]+=times(&buf);
    printf("%d (timeout) - %d %d\n",autre(joueur),temps[1],temps[2]);
    exit(0);
  }

  signal(SIGALRM,sig_handler);

  for (i=0;i<COTE;i++) for (j=0;j<COTE;j++) grille[i][j]=0;

  input[1]=fopen("1.input","wt");
  output[1]=fopen("1.output","rt");
  fprintf(input[1],"1\n"); fflush(input[1]);

  input[2]=fopen("2.input","wt");
  output[2]=fopen("2.output","rt");
  fprintf(input[2],"2\n"); fflush(input[2]);

  for (tour=0;tour<COTE*COTE;tour++)
  {
    temps[joueur]-=times(&buf);
    alarm(TIMEOUT);
    fscanf(output[joueur],"%d %d",&x,&y);
    alarm(0);
    temps[joueur]+=times(&buf);
    fprintf(stderr,"%d %d\n",x,y);
    if ((x>=1)&&(x<=COTE)&&(y>=1)&&(y<=COTE)&&(grille[x-1][y-1]==0)) grille[x-1][y-1]=joueur;
    /* x-1 et y-1 car on numérote de 1 à 20 */
    else
    {
      printf("%d (erreur de l'adversaire) - %d %d\n",autre(joueur),temps[1],temps[2]);
      return(0);
    }
    if (gagnant(grille))
    {
      printf("%d (victoire) - %d %d\n",joueur,temps[1],temps[2]);
      return(0);
    }
    fprintf(input[autre(joueur)],"%d\n%d\n",x,y); fflush(input[autre(joueur)]);
    joueur=autre(joueur);
  }

  printf("0 (match nul) - %d %d\n",temps[1],temps[2]);
  return(0);
}