Exemplo n.º 1
0
/* Dans cette fonction, on possede deux liste : L contenant les cases composant la zone et pile qui possede les cases adjacente aux cases entree en zone et ce termine quand le premier element de la pile est egal au premier element de L */
void trouve_zone_imp(int **M, int dim, int i, int j, int *taille, Liste *L)
{
  int couleur = M[i][j];
  Liste *pile = (Liste *)malloc(sizeof(Liste));
  int trash1,trash2;
  init_liste(pile);
  ajoute_en_tete(pile,i,j);
  //affiche_liste(pile,M);
  M[i][j] = -1;
  (*taille) = 0;
  do {
    ajoute_en_tete(L,(*pile)->i,(*pile)->j);
    (*taille)++;
    enleve_en_tete(pile,&trash1,&trash2);
    /* case de droite */
    if((*L)->i != (dim-1) && M[(*L)->i+1][(*L)->j] == couleur)
    {
      M[(*L)->i+1][(*L)->j] = -1;
      ajoute_en_tete(pile,(*L)->i+1,(*L)->j);
    }
    /* case du bas */
    if ((*L)->j != (dim-1) && M[(*L)->i][(*L)->j+1] == couleur)
      {
	M[(*L)->i][(*L)->j+1] = -1;
	ajoute_en_tete(pile,(*L)->i,(*L)->j+1);
      }
    
    /* case de gauche */
    if ((*L)->i != 0 && M[(*L)->i-1][(*L)->j] == couleur)
      {
	M[(*L)->i-1][(*L)->j] = -1;
	ajoute_en_tete(pile,(*L)->i-1,(*L)->j);
      }

    /* case du haut */
    if((*L)->j != 0 && M[(*L)->i][(*L)->j-1] == couleur)
      {
	M[(*L)->i][(*L)->j-1] = -1;
	ajoute_en_tete(pile,(*L)->i,(*L)->j-1);
      }
  }
  while(!test_liste_vide(pile));
}
Exemplo n.º 2
0
int agrandit_zsg(int **M, S_Zsg *zone, int cl, int k, int l)
{

  Liste *pile = (Liste *)malloc(sizeof(Liste));
  Liste *bordure = (Liste *)malloc(sizeof(Liste));
  int trash1,trash2;
  init_liste(pile);
  init_liste(bordure);
  ajoute_en_tete(pile,k,l);
  
  int taille = 0;
  int couleur;
  
  do{
    k = (*pile)->i;
    l = (*pile)->j;
    if (!(appartient_zsg(M, zone, k, l))){
	ajoute_zsg(M, zone, k, l);
	taille++;
      }
      enleve_en_tete(pile,&trash1,&trash2);
    
    /* case de droite */
    if(k != (zone->dim-1) && zone->App[k+1][l] != -1){
      if(zone->App[k+1][l] != -1 && M[k+1][l] == cl && !(appartient_zsg(M, zone, k+1, l))){
	//printf("(%d, %d) ajouté à zone\n", k+1, l);
	ajoute_en_tete(pile, k+1, l);
      }
    
      else{
	if(M[k+1][l] != cl && !(appartient_bordure(M, zone, k+1, l))){
	  ajoute_bordure(M, zone, k+1, l);
	  //printf("(%d, %d) ajouté à bordure\n", k+1, l);
	}
      }
    }
  

    /* case du bas */
    
    if(l != (zone->dim-1) && zone->App[k][l+1] != -1){
      if(zone->App[k][l+1] != -1 && M[k][l+1] == cl && !(appartient_zsg(M, zone, k, l+1))){
	//printf("(%d, %d) ajouté à zone\n", k, l+1);
	ajoute_en_tete(pile, k, l+1);
      }
    
      else{
	if(M[k][l+1] != cl && !(appartient_bordure(M, zone, k, l+1))){
	  ajoute_bordure(M, zone, k, l+1);
	  //printf("(%d, %d) ajouté à bordure\n", k, l+1);
	}
      }
    }
    
    /* case de gauche */
    if(k != 0 && zone->App[k-1][l] != -1){
      if(zone->App[k-1][l] != -1 && M[k-1][l] == cl && !(appartient_zsg(M, zone, k-1, l))){
	//printf("(%d, %d) ajouté à zone\n", k-1, l);
	ajoute_en_tete(pile, k-1, l);
      }
    
      else{
	if(M[k-1][l] != cl && !(appartient_bordure(M, zone, k-1, l))){
	  // ajoute_en_tete(bordure, k, l+1);
	  ajoute_bordure(M, zone, k-1, l);
	  // printf("(%d, %d) ajouté à bordure\n", k-1, l);
	}
      }
    }
    

    /* case du haut */
    if(l != 0 && zone->App[k][l-1] != -1){
      if(zone->App[k][l-1] != -1 && M[k][l-1] == cl && !(appartient_zsg(M, zone, k, l-1))){
	//printf("(%d, %d) ajouté à zone\n", k, l-1);
	ajoute_en_tete(pile, k, l-1);
      }
    
      else{
	if(M[k][l-1] != cl && !(appartient_bordure(M, zone, k, l-1))){
	  //printf("(%d, %d) ajouté à bordure\n", k, l-1);
	  ajoute_bordure(M, zone, k, l-1);
	}
      }
    }
    
  }while(!test_liste_vide(pile));
  return taille;
}
Exemplo n.º 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;

}