예제 #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 main(int argc,char**argv) {

    int dim, nbcl, nivdif, graine;
    Grille *G;
    int i,j;
    int **M;

    clock_t
    temps_initial, /* Temps initial en micro-secondes */
    temps_final;   /* Temps final en micro-secondes */
    float
    temps_cpu;     /* Temps total en secondes */



    if(argc!=5) {
        printf("usage: %s <dimension nb_de_couleurs niveau_difficulte graine>\n",argv[0]);
        return 1;
    }

    dim=atoi(argv[1]);


    nbcl=atoi(argv[2]);
    nivdif=atoi(argv[3]);
    graine=atoi(argv[4]);

    /* Generation de l'instance */

    M=(int **) malloc(sizeof(int*)*dim);
    for (i=0; i<dim; i++) {
        M[i]=(int*) malloc(sizeof(int)*dim);
        if (M[i]==0) printf("Pas assez d'espace mémoire disponible\n");
    }



    int choix, aff, nbCoups;
    int fin = 0;

    do {
        printf("----------------------Menu----------------------\n");
        printf("0 - SANS affichage graphique\n");
        printf("1 - AVEC affichage graphique\n");
        printf("3 - Quitter\n\n");
        printf("Note: si la dimension entrée est inférieure à 6\non peut visualiser les étapes du jeu et le graphe\nau format texte.\n");

        printf("Choix : ");
        scanf("%d", &aff);
    } while (aff != 0 && aff != 1 && aff != 3);

    if (aff == 3) return 0;
    if (dim < 6) aff = 2;

    printf("\n----------------------Menu----------------------\n");
    printf("1 - Version recursive\n");
    printf("2 - Version imperative\n");
    printf("3 - Version rapide\n");
    printf("4 - Max-bordure\n");
    printf("5 - Parcours en largeur\n");
    printf("6 - Essai strat perso \n");

    printf("Strategie : ");
    scanf("%d", &choix);
    printf("\n-------------------------------------------------\n");

    Gene_instance_genere_matrice(dim, nbcl, nivdif, graine, M);
    //Affichage de la grille

    Grille_init(dim,nbcl, 500,&G);

    Grille_ouvre_fenetre(G);

    for (i=0; i<dim; i++)
        for (j=0; j<dim; j++) {
            Grille_attribue_couleur_case(G,i,j,M[i][j]);
        }
    switch(choix) {
    case 1:
        temps_initial = clock();

        nbCoups = sequence_aleatoire_rec_2(M,G,G->dim,aff);

        temps_final = clock();
        temps_cpu = ((double)(temps_final - temps_initial))/CLOCKS_PER_SEC;
        printf("Nombre de coups:%d\nTemps CPU:%f\n", nbCoups, temps_cpu);

        temps_initial = 0;
        temps_final = 0;
        temps_cpu = 0.0;

        break;

    case 2:
        temps_initial = clock();

        nbCoups = sequence_aleatoire_imp(M,G,G->dim,aff);

        temps_final = clock();
        temps_cpu = ((double)(temps_final - temps_initial))/CLOCKS_PER_SEC;
        printf("Nombre de coups:%d\nTemps CPU:%f\n", nbCoups, temps_cpu);

        temps_initial = 0;
        temps_final = 0;
        temps_cpu = 0.0;

        break;

    case 3:
        //FILE *f1 = fopen("01_rec_num.txt", "a+");

        //temps calcul et l'écrit dans un fichier
        temps_initial = clock();

        nbCoups = sequence_aleatoire_rapide(M,G,aff);

        temps_final = clock();
        temps_cpu = ((double)(temps_final - temps_initial))/CLOCKS_PER_SEC;
        printf("Nombre de coups:%d\nTemps CPU:%f\n", nbCoups, temps_cpu);

        temps_initial = 0;
        temps_final = 0;
        temps_cpu = 0.0;
        //  fclose(f1);
        break;

    case 4:
        temps_initial = clock();

        nbCoups = max_bordure(G, M, aff);

        temps_final = clock();
        temps_cpu = ((double)(temps_final - temps_initial))/CLOCKS_PER_SEC;
        printf("Nombre de coups:%d\nTemps CPU:%f\n", nbCoups, temps_cpu);

        temps_initial = 0;
        temps_final = 0;
        temps_cpu = 0.0;

        break;

    case 5:
        temps_initial = clock();

        nbCoups = chemin(G,M,aff);

        temps_final = clock();
        temps_cpu = ((double)(temps_final - temps_initial))/CLOCKS_PER_SEC;
        printf("Nombre de coups:%d\nTemps CPU:%f\n", nbCoups, temps_cpu);

        temps_initial = 0;
        temps_final = 0;
        temps_cpu = 0.0;

        break;

    case 6:
        temps_initial = clock();
        nbCoups = chemin2(G,M,aff);
        temps_final = clock();
        temps_cpu = ((double)(temps_final - temps_initial))/CLOCKS_PER_SEC;
        printf("Nombre de coups:%d\nTemps CPU:%f\n", nbCoups, temps_cpu);

        temps_initial = 0;
        temps_final = 0;
        temps_cpu = 0.0;

        break;

    default:
        printf("Erreur de saisie\n");
        return 1;
        break;
    }


    Grille_redessine_Grille();

    if (aff != 0)
        Grille_attente_touche();

    Grille_ferme_fenetre();

    Grille_free(&G);
    return 0;
}
예제 #4
0
int main(int argc,char**argv)
{
  int nbcase, nbcl, nivdif, graine, i, j;
  int **M;
  Grille *G;
  //  clock_t
  //    temps_initial, // Temps initial en micro-secondes
  //    temps_final;   // Temps final en micro-secondes 
  //  float temps_cpu; // Temps total en secondes

  if (argc != 5) {
    printf("usage: %s <nb_de_case nb_de_couleurs niveau_difficulte graine>\n",argv[0]);
    return 1;
  }

  //Recuperation des arguments
  sscanf(argv[1], "%d", &nbcase);
  sscanf(argv[2], "%d", &nbcl);
  sscanf(argv[3], "%d", &nivdif);
  sscanf(argv[4], "%d", &graine);

  /* Generation de l'instance */

  M=(int **) malloc(sizeof(int*)*nbcase);
  if(M==NULL)
      exit(EXIT_FAILURE);

  for (i=0;i<nbcase;i++) {
      M[i]=(int*) malloc(sizeof(int)*nbcase);
      if (M[i]==0) printf("OUCH\n");
    }

  Gene_instance_genere_matrice(nbcase, nbcl, nivdif, graine, M);


  /* Affichage de la grille */
  Grille_init(nbcase,nbcl, 500,&G);
  Grille_ouvre_fenetre(G);
  for (i=0;i<nbcase; i++ )
    for (j=0;j<nbcase;j++)
      Grille_chg_case(G,i,j,M[i][j]);

  Grille_redessine_Grille();
  //  Grille_attente_touche();

  int menuchoix;
  
  do {
    printf("Flood-it: menu\n");
    printf("1 Strategie recursive\n");
    printf("2 Strategie iterative\n");
    printf("3 Strategie rapide\n");
    printf("4 Strategie max-bordures\n");
    printf("5 Strategie largeur\n\n");
    printf("0 Quitter\n");
    printf(">> ");
    
    scanf("%d", &menuchoix);

    switch (menuchoix) {
    case 1:
      Gene_instance_genere_matrice(nbcase, nbcl, nivdif, graine, M);
      Grille_init(nbcase,nbcl, 500,&G);
      
      Grille_ouvre_fenetre(G);
      for (i=0;i<nbcase; i++ )
	for (j=0;j<nbcase;j++)
	  Grille_chg_case(G,i,j,M[i][j]);

      printf("%d iterations au total\n",  strategie_aleatoire_rec(G, M, nbcase, nbcl));
      Grille_redessine_Grille();
      Grille_attente_touche();
      Grille_ferme_fenetre();

      Grille_free(&G);
      break;
    case 2:
            Gene_instance_genere_matrice(nbcase, nbcl, nivdif, graine, M);
      Grille_init(nbcase,nbcl, 500,&G);
      
      Grille_ouvre_fenetre(G);
      for (i=0;i<nbcase; i++ )
	for (j=0;j<nbcase;j++)
	  Grille_chg_case(G,i,j,M[i][j]);
      printf("%d iterations au total\n",  strategie_aleatoire_imp(G, M, nbcase, nbcl));
      Grille_redessine_Grille();
      Grille_attente_touche();
      Grille_ferme_fenetre();

      Grille_free(&G);
      break;
    case 3:
      Gene_instance_genere_matrice(nbcase, nbcl, nivdif, graine, M);
      Grille_init(nbcase,nbcl, 500,&G);
      
      Grille_ouvre_fenetre(G);
      for (i=0;i<nbcase; i++ )
	for (j=0;j<nbcase;j++)
	  Grille_chg_case(G,i,j,M[i][j]);
      printf("%d iterations au total\n",  strategie_aleatoire_rapide(G, M, nbcase, nbcl));
      Grille_redessine_Grille();
      Grille_attente_touche();
      Grille_ferme_fenetre();

      Grille_free(&G);
      break;
    case 4: 
      Gene_instance_genere_matrice(nbcase, nbcl, nivdif, graine, M);
      Grille_init(nbcase,nbcl, 500,&G);

      Grille_ouvre_fenetre(G);
      for (i=0;i<nbcase; i++ )
	      for (j=0;j<nbcase;j++)
		      Grille_chg_case(G,i,j,M[i][j]);
      printf("%d iterations au total\n",  maxBordure(G, M, nbcase));
      Grille_redessine_Grille();
      Grille_attente_touche();
      Grille_ferme_fenetre();

      Grille_free(&G);

      break;
    case 5:
      Gene_instance_genere_matrice(nbcase, nbcl, nivdif, graine, M);
      Grille_init(nbcase,nbcl, 500,&G);

      Grille_ouvre_fenetre(G);
      for (i=0;i<nbcase; i++ )
	      for (j=0;j<nbcase;j++)
		      Grille_chg_case(G,i,j,M[i][j]);
      printf("%d iterations au total\n",  StrategieLarge(G, M, nbcase));
      Grille_redessine_Grille();
      Grille_attente_touche();
      Grille_ferme_fenetre();

      Grille_free(&G);
    case 0:
      break;
    default:
      printf("choix?\n\n");
    }
  } while (menuchoix < 0 || menuchoix > 4 || menuchoix != 0);
 

  //  Grille_redessine_Grille();
  //  Grille_attente_touche();

  //	while(1);

  //  Grille_ferme_fenetre();

  //  Grille_free(&G);
  return 0;
}