TOI

 

1ère Olympiade Tunisienne d'Informatique

Ariana, 19 avril 2003

Une solution du problème 3 (VIRUS)

Le jeu de tests pour l'évaluation

/*Ce programme permet de simuler l'évolution d'une population de virus
Cette évolution suit un certain nombre de règles telles que:
1- Un virus qui a au plus deux voinsins meurt par solitude
2- Un virus qui a plus de 4 voinsins meurt par asphyxie
3- Une cellule vide entourée par trois virus, dans les cellules voisines, donne naissance à un nouveau virus

En exécution le programme nécessite deux paramètres :

-         Le nom du fichier contenant la population initiale de virus
-         Le nom du fichier qui va contenir le résultat

Exemple: c:>virus gen_init1.txt genout1.txt

*/

/*Ce programme permet de simuler l'évolution d'une population de virus
Cette évolution suit un certain nombre de règles telles que:
1- Un virus qui a au plus deux voinsins meurt par solitude
2- Un virus qui a plus de 4 voinsins meurt par asphyxie
3- Une cellule vide entourée par trois virus, dans les cellules voisines, donne naissance à un nouveau virus

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 20
#define minn 5
int tvirus[maxn][maxn];//tableau de virus
FILE *fvirus;//fichier source de virus
FILE *fresultat;//fichier source de virus
int m;//ordre de génération
/* Programme Principal*/
int main(int argc, char *argv[])

{
int Remplir_tvirus(char *);
void Afficher_tvirus(int);
void Evolution(int, int[maxn][maxn]);
void Sortir_resultat(char *,int,int);
int ordre;//compteur ordre génération
int i,j,n;
if(argc != 3)

{
fprintf(stderr,"\nErreur parametres à la commande: nomprog fichiervirus fichieresultat\n");
return(1);
}

fvirus=fopen(argv[1],"r");
/*Initialisation du tableau tvirus à zéro*/
for (i=0;i<maxn;i++)
for (j=0;j<maxn;j++) tvirus[i][j]=0;
n=Remplir_tvirus(argv[1]);
fclose(fvirus);
Afficher_tvirus(n);


//Evolution de la génération
printf("Donner l'ordre d\'évolution:");
scanf("%d",&m);
for(ordre=1;ordre<=m;ordre++)

{
Evolution(n,tvirus);
Afficher_tvirus(n);
}

printf("Tapez une touche pour quitter...");
getchar();

//Affichage et Sortie du résultat
printf("\nEcriture du résultat dans le fichier %s",argv[2]);
Afficher_tvirus(n);
Sortir_resultat(argv[2],n,m);
printf("\nFin Programme Virus");
printf("Tapez une touche pour quitter...");
getchar();
return(0);
}

// Les fonctions du programme

//Ecriture du résultat dans un fichier

void Sortir_resultat(char *nomfresult,int ns,int ms)

{
int is,js;
fresultat=fopen(nomfresult,"w+");
fprintf(fresultat, "%d\n",ms);
          for (is=0;is<ns;is++)
          for (js=0;js<ns;js++)
          if(tvirus[is][js]==1)
          fprintf(fresultat,"%d %d\n",is+1,js+1);
fclose(fresultat);
}

//Evolution d'une génération à une autre
void Evolution(int ne,int tviruse[maxn][maxn])

{
int nvirusvois;//nombre de virus voisins
int ie,je,i1,j1;
//evolution
for(ie=0;ie<ne;ie++)
for(je=0;je<ne;je++)
{
          nvirusvois=0;
          for(i1=ie-1;i1<=ie+1;i1++)
          for(j1=je-1;j1<=je+1;j1++)
                   {
                   if((i1>=0)&&(i1<ne)&&(j1>=0)&&(j1<ne)) //Eviter débordement*
                   {

                             //Exclure le centre et incrémenter
                             if((tviruse[i1][j1]==1)&& !((i1==ie)&&(j1==je)))
                                                                                                                                                nvirusvois++;
                   }

                   }

          if(tviruse[ie][je]==0)
          {
                   if(nvirusvois==3) tviruse[ie][je]=1;
          }
          else
          {
                   if ((nvirusvois<=2)||(nvirusvois>=5))
                             if (tviruse[ie][je]==1) tviruse[ie][je]=0;
          }

}

}

//Afffichage de la matrice de virus
void Afficher_tvirus(int na)
{int ia,ja;
getchar();
printf("Affichage tvirus");
printf("\n n=%d\n",na);
getchar();
          for (ia=0;ia<na;ia++)
          {
          for (ja=0;ja<na;ja++)
                   if(tvirus[ia][ja]==0)
                   printf(". ");
                   else    printf("* ");
                   printf("\n");
          }

}
//Chargement du tableau à partir du fichier source
int Remplir_tvirus(char *nomfichier)
{

int x,y,nr;
printf("\nPopulation des Virus\n");
fvirus=fopen(nomfichier,"r");
          if (fvirus != NULL)
                   {
                             fscanf(fvirus,"%d\n",&nr);
                             printf("\n n=%d\n",nr);
                             while(!feof(fvirus))
                             { fscanf(fvirus,"%d",&x);
                               fscanf(fvirus,"%d\n",&y);
                               tvirus[x-1][y-1]=1;
                               printf("\ntvirus(%d,%d)=%d",x,y,tvirus[x-1][y-1]);
                             }
                   }

fclose(fvirus);
return(nr);

}

 

Les 5 tests pour le programmes W_ORDERED (20 points par test)

Test 1

Test2

Test3

Test4

Test5

GEN_INIT1

GEN_INIT2

GEN_INIT3

GEN_INIT4

GEN_INIT5

6

1 1

1 2

2 2

2 3

3 3

3 4

4 2

4 3

4 4

5 2

5 3

5 4

6 3

6 4

6 5

6 6

7

1 1

1 2

1 3

1 4

1 5

1 6

1 7

2 1

2 2

2 4

2 6

2 7

3 4

4 1

4 2

4 3

4 4

4 5

4 6

4 7

5 4

6 1

6 2

6 4

6 6

6 7

7 1

7 2

7 3

7 4

7 5

7 6

7 7

17

1 2

1 6

2 1

2 2

2 3

2 4

2 5

2 6

2 7

3 2

3 6

4 2

5 1

5 2

5 3

5 4

5 5

5 6

5 7

6 2

6 6

7 1

7 3

7 5

8 10

8 11

8 12

8 13

8 14

8 15

8 16

8 17

9 8

9 10

9 12

9 14

9 16

10 1

10 2

10 5

10 7

10 9

10 13

10 15

11 5

11 8

12 1

12 2

12 3

12 11

12 14

12 15

13 1

13 2

13 5

13 14

13 15

13 16

14 14

14 15

14 16

15 2

15 3

15 5

15 8

15 10

15 12

15 15

16 10

17 1

17 3

17 5

17 7

17 9

17 10

17 12

17 15

17 17

12

1 2

2 1

2 2

2 3

3 3

3 4

4 2

4 3

4 4

4 5

5 4

5 5

5 6

7 1

7 2

7 5

7 8

7 9

7 10

7 11

7 12

8 7

8 9

8 10

8 11

8 12

9 2

9 3

9 4

9 5

9 10

9 11

9 12

10 8

10 10

10 11

10 12

11 1

11 3

11 5

11 10

12 3

12 4

12 5

12 9

12 11

9

1 1

1 2

1 3

1 4

1 5

1 6

1 9

2 1

2 2

2 4

2 6

2 9

3 4

4 4

4 1

4 2

4 3

4 4

4 5

4 6

4 9

5 3

5 4

6 1

6 2

6 4

6 6

6 7

6 9

7 1

7 2

7 3

7 4

7 5

7 6

7 7

7 9

8 3

8 4

9 3

9 4

9 5

9 6

9 7

9 8

9 9

GEN_OUT1

GEN_OUT2

GEN_OUT3

GEN_OUT4

GEN_OUT5

3

4 3

5 4

4

2 6

5

2 5

5 13

5 14

6 12

6 14

7 14

7 15

8 14

8 15

8 16

9 14

9 16

9 17

10 15

13 16

13 17

14 16

14 17

15 17

16 16

16 17

17 16

17 17

6

10 11

10 12

11 11

11 12

3

1 1

1 2

1 3

1 4

1 5

2 1

2 5

3 1

3 2

3 3

3 4

3 6

4 6

 

Accueil | 1er Stage | 2ème Stage | 3ème Stage | TOI | AOI | IOI | Edunet