-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBackup.Flood-It-1.c
158 lines (117 loc) · 3.68 KB
/
Backup.Flood-It-1.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "Flood-It-1.h"
int main(int argc,char**argv){
int nbcase, nbcl, nivdif, graine, i, j, **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);
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 taille = 0, iterStrategie;
int coul = M[0][0] == 0? 1 : 0;
//colorie_zone_rec(M, 0, 0, coul, &taille, nbcase);
iterStrategie = strategie_aleatoire_rec(G, M, nbcase, nbcl);
printf("%d Iterations necessaires!\n", iterStrategie);
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();
// while(1);
Grille_ferme_fenetre();
Grille_free(&G);
return 0;
}
//Colorie la case (i,j) et la zone environnante, appel recursif si les cases autour sont de la meme couleur que la case visee
//Incremente un compteur du nombre de casses changees
//ARGS: matrice, colonne, ligne, couleur, pointeur vers taille, taille de la matrice
void colorie_zone_rec(int ** tab, int i, int j, int cl, int* taille, int nbCases)
{
int couleurActuelle = tab[i][j]; //Memorisation de la couleur avant changement
//Changement de la couleur avant l'appel recursif pour eviter les boucles infinies
tab[i][j] = cl;
if(cl == couleurActuelle) //Evite les boucles infinies si la case a deja la couleur demandee
{
return;
}
//Verification des couleurs des cases environnantes
if( (i > 0) && (couleurActuelle == tab[i-1][j])) //A gauche
{
fprintf(stderr, "Going to: i->%d j->%d\n", (i - 1), j);
colorie_zone_rec(tab, (i-1), j, cl, taille, nbCases);
}
if( (j > 0) && (couleurActuelle == tab[i][j-1])) //Au dessus
{
fprintf(stderr, "Going to: i->%d j->%d\n", i, (j - 1));
colorie_zone_rec(tab, i, (j-1), cl, taille, nbCases);
}
if( (i < (nbCases - 1)) && (tab[i+1][j] == couleurActuelle)) // A droite
{
fprintf(stderr, "Going to: i->%d j->%d\n", (i + 1), j);
colorie_zone_rec(tab, (i+1), j, cl, taille, nbCases);
}
if( (j < (nbCases - 1)) && (tab[i][j+1] == couleurActuelle)) //En dessous
{
fprintf(stderr, "Going to: i->%d j->%d\n", i, (j + 1));
colorie_zone_rec(tab, i, (j+1), cl, taille, nbCases);
}
(*taille)++;
}
/*
* Change aleatoirement la couleur de la premiere case et la zone des cases de sa couleur
* args: Matrice, nbCases, nombre de couleurs
*/
int strategie_aleatoire_rec(Grille* G, int ** tab, int nbCases, int nbCl)
{
srand(time(NULL)); //Generation de la graine
int r, i, j, taille = 0, cpt = 0;
while(taille < (nbCases * nbCases))
{
taille = 0; //initialisation du compteur
r = rand() % nbCl; //Initialisation de la couleur aleatoire € [0;nbCl[
colorie_zone_rec(tab, 0, 0, r, &taille, nbCases);
for (i=0;i<nbCases; i++ )
{
for (j=0;j<nbCases;j++)
{
Grille_chg_case(G,i,j,tab[i][j]);
}
}
Grille_redessine_Grille();
Grille_attente_touche();
cpt++;
}
return cpt;
}