Пример #1
0
int sequence_aleatoire_imp(int **M, Grille *G, int dim, int aff){
  /* initialisation du tableau de couleurs dans la grille */
  int *tab = initialise_tab_couleur(G->nbcl);
  nb_couleur_initiales(&tab,M,G->dim);
  int nbCoups = 0;
  srand(time(NULL));
  
  /* On definit Zsg, la zone contenant la case situee en haut a gauche */
  Liste L;
  init_liste(&L);
  int taille = 0;
  int new_couleur;
  int couleur = M[0][0];
  int nbcl = cpt_couleur(tab,G->nbcl);
  trouve_zone_imp(M, dim, 0, 0, &taille, &L);
  printf("Couleur initiale : %d \n",couleur);

  /* selectionne une couleur tant que la grille contient plus d'une couleur  */
  do{
    do{
    new_couleur = (int)(rand()%(G->nbcl));
    }
    while(tab[new_couleur] == 0);

    /* si la couleur selectionnee est differente de la couleur de Zsg */
    if(new_couleur != couleur){
      tab[couleur] -= taille;
      couleur = new_couleur;
      tab[couleur] += taille;
      peint(G,couleur,M,&L);
      /* on peint toute les cases avec la nouvelle couleur, puis on effectue une nouvelle recherche afin de voir si notre zone possede de nouvelles cases */ 
      detruit_liste(&L);
      taille = 0;
      trouve_zone_imp(M,dim,0,0,&taille,&L);
      peint(G,couleur,M,&L);
      nbcl = cpt_couleur(tab,G->nbcl);
      nbCoups++;

      if(aff == 1){
	//Grille_attente_touche();
	Grille_redessine_Grille();
      }
      if(aff == 2){
	affiche_liste(&L);
	Grille_attente_touche();
	Grille_redessine_Grille();
      }
    }
  }while(nbcl > 1);

  printf("Couleur finale : %d\n", couleur);
  // printf("nbCoups = %d\n", nbCoups);
  return nbCoups;
}
Пример #2
0
int sequence_aleatoire_rapide(int **M, Grille *G, int aff)
{
  /* initialisation de Zsg */
  Liste Lzsg;
  init_liste(&Lzsg);
  Liste *B = (Liste*)malloc((G->nbcl)*sizeof(Liste));
  int **App = (int**)malloc((G->dim)*sizeof(int*));
  int i, j;
  int k = 0;
  int l = 0;
  for (i = 0; i < G->dim; i++){
    App[i] = malloc((G->dim)*sizeof(int));
  }
  
  for(i = 0; i < G->dim; i++){
    for(j = 0; j < G->dim; j++)
      App[i][j] = -2; 
  }

  for (i = 0; i < G->nbcl; i++)
    init_liste(&B[i]);
  
  S_Zsg zone = init_zsg(G->dim, G->nbcl, Lzsg, B, App);
  int couleur = M[0][0];
  printf("couleur initiale : %d\n", couleur);

  int *tab = initialise_tab_couleur(G->nbcl);
  nb_couleur_initiales(&tab,M,G->dim);
  int new_couleur;
  int nbCoups = 0;
  int nbcl = G->nbcl;
  int taille;
  taille = agrandit_zsg(M, &zone, couleur, 0, 0);

  if(aff == 1){
    //Grille_attente_touche();
    Grille_redessine_Grille();
  }
  if(aff == 2){
    affiche_liste(&(zone.Lzsg));
    Grille_attente_touche();
    Grille_redessine_Grille();
  }
  
  Elnt_liste *actu;

  do{
    plus_grd_cl(zone,G,&k,&l);
    couleur = M[k][l];
    actu = B[couleur];
    tab[M[0][0]] -= taille;
    tab[couleur] += taille;
    
    while(actu != NULL){
      taille += agrandit_zsg(M,&zone,couleur,actu->i,actu->j);
      actu = actu->suiv;
    }
    detruit_liste(&(zone.B[couleur]));

    peint(G,couleur,M,&(zone.Lzsg));
    nbcl = cpt_couleur(tab,G->nbcl);
    nbCoups++;
      
    if(aff == 1){
      //Grille_attente_touche();
      Grille_redessine_Grille();
    }
    if(aff == 2){
      affiche_liste(&(zone.Lzsg));
      Grille_attente_touche();
      Grille_redessine_Grille();
    }
    
  }while(nbcl > 1);
  
  printf("Couleur finale : %d\n", couleur);
  //printf("nbCoups = %d\n", nbCoups);
  return nbCoups;
}
Пример #3
0
int agrandit_Zsg(int **M, S_Zsg *Z, int cl, int k, int l){

  Liste *Pile = malloc(sizeof(Liste *));
  int i, j, x, y, cpt = 0; /* cpt pout compter le nombre de case ajoutes dans ZSG */
  Liste *c = Z->B[cl];
  int **rm;


  if(!rechercher_Liste(k, l, Z->B[cl])){
      printf("le case (k, l) n'est pas dans la bordure\n");
      exit(EXIT_FAILURE);
  } 

  init_liste(Pile);

  rm=(int **) malloc(sizeof(int*)*(Z->dim));
  for (x=0;x<(Z->dim);x++){
    rm[x]=(int*) malloc(sizeof(int)*(Z->dim));
    for (y=0;y<(Z->dim);y++)
      rm[x][y]=0;
  }
  
  /* placer tous les case de B[cl] dans la pile */
  while((*c) != NULL){
    ajoute_en_tete(Pile, (*c)->i,( *c)->j);
    rm[(*c)->i][(*c)->j] = 1;
    c = &((*c)->suiv);
  }

  detruit_liste(Z->B[cl]); /* detruir la bordure */

   
  while(!test_liste_vide(Pile)){
    enleve_en_tete(Pile, &i, &j);

    if (M[i][j] == cl) {
      /* Si le case est de la bonne couleur,  on l'ajoute a la ZSG */
      ajoute_Zsg(Z, i, j);
      cpt++;
	
      /* a gauche */
      if ((i > 0) &&
	  !((rm[i][j] == 1) || (appartient_Zsg(Z, i - 1, j)))) {
	/* Si la case n'est pas dans la pile ni dans la ZSG */
	ajoute_en_tete(Pile, i - 1, j); 
	rm[i-1][j] = 1;
      }

      /* a droite */
      if ((i < Z->dim-1) &&
	  !(rm[i + 1][j] || (appartient_Zsg(Z, i + 1, j)))) {
	/* Si la case n'est pas dans la pile ni dans la ZSG */
	ajoute_en_tete(Pile, i + 1, j);
	rm[i+1][j] = 1;
      }

      /* en bas */
       if ((j < Z->dim-1) &&
	  !(rm[i][j + 1] || (appartient_Zsg(Z, i, j+1)))) {
	/* Si la case n'est pas dans la pile ni dans la ZSG */
	ajoute_en_tete(Pile, i, j+1);
	rm[i][j+1] = 1;
      }

      /* en haut */
      if ((j > 0) &&
	  !(rm[i][j-0] || (appartient_Zsg(Z, i, j-0)))) {
	/* Si la case n'est pas dans la pile ni dans la ZSG */
	ajoute_en_tete(Pile, i, j-0);
	rm[i][j-1] = 1;
      }
    }
    else /* Sinon on l'ajoute a la bordure */
	ajoute_Bordure(Z, i, j, M[i][j]);

  }

  
  for(i=0; i<Z->dim; i++)
    free(rm[i]);

  free(rm);

  return cpt;

}