Sunteți pe pagina 1din 4

#include <stdio.

h>
#include <stdlib.h>
#define max 1010
int Acopy[max][max],A[max][max],n,m,k,nrmax=0;
char optiune;
void read()
{
int i,j;
scanf("%c%d%d%d",&optiune,&m,&n,&k);
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
scanf("%d",&A[i][j]);
}
void print()
{
int i,j;
for(i=1; i<=n; i++)
{
for(j=1; j<=m; j++)
printf("%d ",A[i][j]);
printf("\n");
}
}
void copy()
//Subprogram pentru reactualizarea grid-ului
{
int i,j;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
A[i][j]=Acopy[i][j];
}
void bordare()
//In cazul toroidului matricea se va borda dupa 3
cazuri, pentru a nu se lua anumiti vecini de 2 ori{
{
int i,j;
if(n<=2&&m>2)
// Cazul I, nu vom actualiza colturile
{
for(i=1; i<=n; i++)
{
A[i][0]=A[i][m];
A[i][m+1]=A[i][1];
}
}
else if(m<=2&&n>2)
//Cazul II, nu vom actualiza colturile
{
for(i=1; i<=m; i++)
{
A[0][i]=A[n][i];
A[n+1][i]=A[1][i];
}
}
else
//Cazul III, vom actualiza colturile, fiecare celu
la putand avea 8 vecini
{
for(i=1; i<=m; i++)

{
A[0][i]=A[n][i];
A[n+1][i]=A[1][i];
}
for(i=1; i<=n; i++)
{
A[i][0]=A[i][m];
A[i][m+1]=A[i][1];
}
//Actulizez colturile
A[0][0]=A[n][m];
A[0][m+1]=A[n][1];
A[n+1][0]=A[1][m];
A[n+1][m+1]=A[1][1];
}
}
void nr_celule_vii()
ari populatii de celule vii
{
int i,j,nr=0;

//Subprogram pentru determinarea celei mai m

for(i=1; i<=n; i++)


for(j=1; j<=m; j++)
nr+=A[i][j];
if(nr>nrmax)
nrmax=nr;
}
float gradM_populare()
//Subprogram pentru determinarea procentului
{
return (float)(nrmax*100)/(n*m);
}
void generare()
//Subprogramul general care va verif
ica cele 4 reguli ale jocului in ambele
{
const int dl[8]= {-1,-1,-1,0,0,1,1,1}; //Pentru accesarea vecinilor unei cel
ule x,y folosesc 2 vectori de pozitii:
const int dc[8]= {-1,0,1,-1,1,-1,0,1}; // dl[] vectorul pentru indicii de l
inie si respctiv dc[] indicii de coloana
int i,j,d;
nr_celule_vii();
for(i=1; i<=n; i++) //parcurgerea matricii
for(j=1; j<=m; j++)
{
int vecini=0;
for(d=0; d<=7; d++)
//Parcurgem vectorii de poziitii si
calculam suma celulelor adiacente celulei pe
vecini+=A[i+dl[d]][j+dc[d]]; //pe care ne aflam.Suma va reprez
enta de fapt numarul de celule vii adiacente.
Acopy[i][j]=0;
//Utilizez o matrice auxiliara in care
realizez eventualele modificari ale unei celule
if(A[i][j]==1&&vecini<2)
Acopy[i][j]=0;
else if(A[i][j]==1&&(vecini==2||vecini==3))

Acopy[i][j]=1;
else if(A[i][j]==1&&vecini>3)
Acopy[i][j]=0;
else if(A[i][j]==0&&vecini==3)
Acopy[i][j]=1;
}
}
void generare_Plan()
{
int i,j,d,generari;
for(generari=1; generari<=k; generari++)
{
generare();
copy();
//Folosind functia copy, reactualizez m
atricea initiala cu schimbarile facute
}
nr_celule_vii();
}
void generare_Toroid()
{
int i,j,generari,d;
for(generari=1; generari<=k; generari++)
{
if(n<=2&&m<=2)
{
nr_celule_vii();
generare_Plan();
}
else
{
nr_celule_vii();
bordare();
//Pt cazul toroidului principiul
de functionare este acelasi, difera doar vecinii
generare();
//celulelor marginale care vor avea si ele 8
vecini, in acest caz matricea va fi bordata
}
copy();
}
nr_celule_vii();
}
int main()
{
float procent;
read();
switch(optiune)
{
case 'P':
{
generare_Plan();
printf("\n");
print();
procent=gradM_populare();
printf("%.3f%c",procent,'%');
}

break;
case 'T':
{
generare_Toroid();
printf("\n");
print();
procent=gradM_populare();
printf("%.3f%c",procent,'%');
}
break;
}
return 0;
}

S-ar putea să vă placă și