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; }
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; }
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; }