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
| // test si un index de tableau est valide
// on travaille avec des matrices 20x20
int validindex ( int n)
{
return ((n>=0)&& (n<20));
}
// pour compter les voisins
// du point d'ndices (i,j) de la matrice A
int CV ( int i, int j)
{
int compteur = 0;
int u, v;
for (u=i-1; u<=i+1; u++)
for (v=j-1; v<=j+1; v++)
if (validindex(u)&&validindex(v)&&A[u][v]) compteur ++;
if (A[i][j]) compteur --;
return compteur;
}
// passage d'une étape à la suivante
void Next()
{
int i, j, n;
for (i=0; i<20; i++)
for (j=0; j<20; j++)
{
n= CV(i,j);
if ((!A[i][j]) && n==3) B[i][j]=1; // 3 voisins : naissance
else if (A[i][j] && n<2) B[i][j]=0; // moins de 2 voisins: mort
else if (A[i][j] && n>3) B[i][j] =0; // 4 et plus: mort
else if (A[i][j]) B[i][j] =1; // sinon status quo ante
else B[i][j]=0; // ne doit pas se produire juste pour éviter le warning
}
for (i=0; i<20; i++) // recopie de B dans A
for (j=0; j<20; j++)
A[i][j]=B[i][j];
}
// test de l'état stable
int Stab()
{
int i, j, n;
int r=1;
for (i=0; i<20; i++)
for (j=0; j<20; j++)
{
n= CV(i,j);
if ((!A[i][j]) && n==3) B[i][j]=1;
else if (A[i][j] && n<2) B[i][j]=0;
else if (A[i][j] && n>3) B[i][j] =0;
else if (A[i][j]) B[i][j] =1;
else B[i][j]=0;
}
for (i=0;i<20;i++)
for (j=0;j<20;j++)
if (A[i][j]!=B[i][j]) r=0;
return r;
}
// Itération
int Go()
{
int c = 0;
while (1)
{
Next();
c++;
if (Stab()) break;// soit on a un état stable
if (c==1000) break; // soit on s'arrête après 1000 itérations
}
return c;
} |
Partager