#include int** creaMatriz( int rows, int cols ) { int** mat = new int*[ rows ]; int i; for( i = 0; i < rows; i++ ) mat[i] = new int[ cols ]; return mat; } void borraMatriz( int rows, int cols, int** mat ) { int i; for( i = 0; i < rows; i++ ) delete[] mat[i]; delete[] mat; } void leeEntrada( int *r, int *c, int *k, int ***m ) { FILE *input = fopen( "input.txt", "rt" ); int i, j; fscanf( input, "%d %d", r, c ); fscanf( input, "%d", k ); *m = creaMatriz( *r, *c ); for( i = 0; i < *r; i++ ) for( j = 0; j < *c; j++ ) fscanf( input, "%d", &m[0][i][j] ); fclose( input ); } void escribeSalida( int r, int c, int **m ) { FILE *output = fopen( "output.txt", "wt" ); int i, j; for( i = 0; i < r; i++ ) { for( j = 0; j < c; j++ ) fprintf( output, "%d ", m[i][j] ); fprintf( output, "\n" ); } fclose( output ); } int cuentaVecinos( int rows, int cols, int **mat, int r, int c ) { int i, j, suma = 0; for( i = -1; i <= 1; i++ ) for( j = -1; j <= 1; j++ ) if( i != 0 || j != 0 ) suma += mat[ ( r + i + rows )%rows ][ ( c + j + cols )%cols ]; return suma; } void procesaPaso( int rows, int cols, int **mat, int **next ) { int i, j, cuenta; for( i = 0; i < rows; i++ ) for( j = 0; j < cols; j++ ) { cuenta = cuentaVecinos( rows, cols, mat, i, j ); if( cuenta >= 4 || cuenta <= 1 ) next[i][j] = 0; else if( cuenta == 3 ) next[i][j] = 1; else if( cuenta == 2 ) next[i][j] = mat[i][j]; } } int main() { int rows, cols, **matriz, **siguiente, **swap, k, i; leeEntrada( &rows, &cols, &k, &matriz ); siguiente = creaMatriz( rows, cols ); for( i = 0; i < k; i++ ) { procesaPaso( rows, cols, matriz, siguiente ); swap = matriz; matriz = siguiente; siguiente = swap; } escribeSalida( rows, cols, matriz ); borraMatriz( rows, cols, matriz ); borraMatriz( rows, cols, siguiente ); return 0; }