int ajoute_bordure(int **M, S_Zsg *zone, int i, int j) { int couleur; couleur = M[i][j]; ajoute_en_tete(&(zone->B[couleur]),i,j); zone->App[i][j] = couleur; return 1; }
/* ajoute la case M[i][j] dans la zone */ int ajoute_zsg(int **M, S_Zsg *zone, int i, int j) { int couleur; int t,t2; couleur = M[i][j]; ajoute_en_tete(&(zone->Lzsg),i,j); zone->App[i][j] = -1; return 1; }
void ajoute_Bordure(S_Zsg *sz, int i, int j, int cl){ if (i > sz->dim || j > sz->dim) exit(EXIT_FAILURE); /* Remplace la liste par une nouvelle liste contenant la case supplemantaire */ ajoute_en_tete(sz->B[cl], i, j); /* Remplace la reference a la liste dans le tableau App */ if (cl<100) sz->App[i][j] = cl; }
void ajoute_Zsg(S_Zsg *sz, int i, int j){ if (i > sz->dim || j > sz->dim) exit(EXIT_FAILURE); if (sz->App[i][j] != -1) { /* Remplace la liste par une nouvelle liste contenant la case supplemantaire */ ajoute_en_tete(sz->Lzsg, i, j); /* Remplace la reference a la liste dans le tableau App */ sz->App[i][j] = -1; } }
/* 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)); }
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; }
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; }