#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define bool int
#define VRAI 1
#define FAUX 0
#define MAX 10000

/*tire un entier au hasard entre inf et sup */
int hasard(int inf,int sup)
{
  int rando = rand();

  return (inf + (rando % (sup - inf +1)));
}


/*on utilise le tableau jusqu'à la case N-1*/
/*cette procédure initialise avec premiere case à C, les N-1 à I */
/*et ce que contiennent les autres cases on s'en fiche*/
void initialise_tab(char t[MAX],int N)
{
  int i;
  t[0]='C';
  for (i=1;i<=N-1;i=i+1)
    {
      t[i]='I';
    }
}

/*visualisation du tableau utile*/
void visu_tab(char t[MAX],int N)
{
  int i;
  printf("[");
  for (i=0;i<=N-2;i=i+1)
    {
      printf(" %c ,",t[i]);;
    }

  printf(" %c ]\n",t[N-1]);
}


/*compte le nb d'occurences du char donne en parametre,*/
/*dans le tableau, jusqu a la case N-1 comprise*/
int compte_occurrences(char t[MAX],int N, char c)
{
  int i; int nb = 0;
  
  for (i=0;i<=N-1;i=i+1)
    {
      if (t[i] == c)
	{
	  nb = nb+1;
	}
    }
  return nb;
}

/*ici X diff de Y*/
/*rencontre X/Y :  modifie en consequence le tableau*/
/*faire attention, la personne i est dans la case i-1*/
/*on remarque que le statut est modifie que si l'un des statuts vaut C*/
int joue_rencontre(char t[MAX],int X, int Y, int nbC)
{
  int tmp;
  int i = X-1;
  int j = Y-1;
  int res = nbC;
  /*si le statut de j est 'C' j'echange i et j*/
  if (t[j] == 'C') {tmp = i; i = j; j = tmp;}
  if (t[i] == 'C')
    if (t[j] == 'C') 
      {t[i] = 'M' ; t[j] = 'M'; res = res -2;}
    else 
      if (t[j] == 'I') 
	{t[j] = 'C'; res = res + 1;}
      else 
	{t[i] = 'M'; res = res - 1;}
  
  return res;
}



void manuel(char tab[MAX])
{
  int N; int nbC = 1;
  N = 5; 
  visu_tab(tab,N);
  nbC = joue_rencontre(tab,3,5,nbC);
  visu_tab(tab,N); 
  nbC = joue_rencontre(tab,2,4,nbC);
  visu_tab(tab,N); 
  nbC = joue_rencontre(tab,4,1,nbC);
  visu_tab(tab,N); 
  nbC = joue_rencontre(tab,3,2,nbC);
  visu_tab(tab,N); 
  nbC = joue_rencontre(tab,1,5,nbC);
  visu_tab(tab,N); 
  nbC = joue_rencontre(tab,4,5,nbC);
  visu_tab(tab,N); 
  nbC = joue_rencontre(tab,3,4,nbC);
  visu_tab(tab,N); 
  nbC = joue_rencontre(tab,5,4,nbC);
  visu_tab(tab,N); 
  nbC = joue_rencontre(tab,5,1,nbC);
  visu_tab(tab,N); 
  printf("Nb de 'C': %d\n",nbC);
}



/*Nouvelle 1*/
void nouvelle1(char tab[MAX],int N)
{
  int nbI ; int nbJ;
  int X;
  int Y;
  int nbC = 1;
  bool continuer = VRAI;
  nbJ = 0;
  
  initialise_tab(tab,N);
  visu_tab(tab,N);

  while( nbC !=0)
    {
      /*tirage de la rencontre*/
      X = hasard(1,N);
      Y = hasard(1,N);
      /*il FAUT que X soit diff de Y*/
      while (X==Y) {Y = hasard(1,N);};
      printf("Ceci est une rencontre %d vs %d\n",X,Y);
      
      nbC = joue_rencontre(tab,X,Y,nbC);
      printf("Nb de C : %d \n",nbC);
      visu_tab(tab,N);
      nbJ = nbJ+1;
    }
  printf("Nb de jours de propagation : %d\n",nbJ-1);
  nbI = compte_occurrences(tab,N,'I');
  printf("nombre d'ignorants: %d\n",nbI);


}


void nouvelle2(char tab[MAX],int N, int NS)
{
  int nbI ; int nbJ;
  int X;
  int Y;
  int nbC;
  int i;

  int sommeI = 0 ; int sommeJ = 0;
  
  for (i=0;i<=NS-1;i=i+1)
    {
      nbJ = 0;      
      nbC = 1;
      /*une simulation*/
      initialise_tab(tab,N);
      while( nbC !=0)
	{
	  X = hasard(1,N);
	  Y = hasard(1,N);
	  while (X==Y) {Y = hasard(1,N);};
	  nbC = joue_rencontre(tab,X,Y,nbC);
	  nbJ = nbJ+1;
	}
      nbI = compte_occurrences(tab,N,'I');
      sommeI = sommeI + nbI ;
      sommeJ = sommeJ + nbJ - 1 ;
    }

  printf("La moyenne du nb jours de propa est %d\n",sommeI/NS);
  printf("La moyenne du nb d'ignorants est %d\n",sommeJ/NS);
}

/* pour N = 100 */
/* Donnez le NS (nb simul) */
/* 100000 */
/* La moyenne du nb jours de propa est 20 */
/* La moyenne du nb d'ignorants est 673 */
/* 15.250u 0.000s 0:18.76 81.2%    0+0k 0+0io 96pf+0w */


void nouvelle3(char tab[MAX],int N)
{
  /* la flemme gagne le correcteur */
}

int main(void)
{

  int N;  int X;  int Y; int cpt; int NS;

  /*en C on ne peut pas déclarer des tableaux sans taille */
  /* donc on met une taille MAX que l'utilisateur ne peut depasser */
  char tab[MAX];

  /*initialisation du generateur de nb alea*/
  srand(time(NULL));  

  /*initialisation du tableau*/
  printf("Donnez le N svp, il doit etre stric. inf à %d\n",MAX);
  scanf("%d",&N);
  initialise_tab(tab,N);
  visu_tab(tab,N);

  /*essai "manuel" */
  manuel(tab);
  /*fin essai manuel*/

  /*nouvelle1*/
  nouvelle1(tab,N);

  /*nouvelle2*/
  printf("Donnez le NS (nb simul) \n");
  scanf("%d",&NS);
  nouvelle2(tab,N,NS);

   /*nouvelle3*/
  nouvelle3(tab,N); 

  return 0;
}
