#include <stdio.h>
#include <stdlib.h>

using namespace std;

char ** alocar_matriz_char(int n_lin, int n_col){
    char ** m;

    m = (char**)malloc(sizeof(char*)*n_lin);

    for (int i=0;i<n_lin;i++){
        m[i] = (char*)malloc(sizeof(char)*n_col);
    }

    return m;
}


void desalocar_matriz_char(char **m,int n_lin,int n_col){
    if (m){
        for (int i=0;i<n_lin;i++)
        if (m[i]){
            free(m[i]);
        }
        free(m);
    }
}

int ** alocar_matriz_int(int n_lin, int n_col){
    int ** m;

    m = (int**)malloc(sizeof(int*)*n_lin);

    for (int i=0;i<n_lin;i++){
        m[i] = (int*)malloc(sizeof(int)*n_col);
    }

    return m;
}

void desalocar_matriz_int(char **m,int n_lin,int n_col){
    if (m){
        for (int i=0;i<n_lin;i++)
        if (m[i]){
            free(m[i]);
        }
        free(m);
    }
}

void imprimir_matriz_char(char ** m,int n_lin, int n_col){
    printf("\nn_lin_a:%d n_col_a:%d\n",n_lin,n_col);
    for (int i=0;i<n_lin;i++){
        for (int j=0;j<n_col;j++){
            printf("%c ",m[i][j]);
        }
        printf("\n");
    }
}

void imprimir_matriz_int(int ** m,int n_lin, int n_col){
    printf("\nn_lin_a:%d n_col_a:%d\n",n_lin,n_col);
    for (int i=0;i<n_lin;i++){
        for (int j=0;j<n_col;j++){
            printf("%d ",m[i][j]);
        }
        printf("\n");
    }
}


char ** ler_matriz(char * file_name, int *n_lin, int *n_col){

    FILE *f = fopen(file_name,"r");

    if (!f){
        printf("Arquivo nao encontrado\n");
        exit(1);
    }


    fscanf(f,"%d %d",n_lin,n_col);

    char ** m = alocar_matriz_char(*n_lin,*n_col);

    for (int i=0;i<*n_lin;i++){
        for (int j=0;j<*n_col;j++){
            // ignora espaços em branco " %c"
            fscanf(f," %c",&m[i][j]);
        }
    }

    fclose(f);

    return m;
}

void computar_contagem(char **bombas, int **contagem, int n_lin, int n_col){

    for (int i=0;i<n_lin;i++){
        for (int j=0;j<n_col;j++){
           contagem[i][j]=0;
           if (bombas[i][j]=='0'){
              int cel_i;
              int cel_j;
              for (int k=-1;k<=1;k++){
                 for(int l=-1;l<=1;l++){
                    cel_i = i+k;
                    cel_j = j+l;
                    if ( (cel_i>=0) && (cel_i<n_lin) && (cel_j>=0) && (cel_j<n_col) ){
                        if (bombas[cel_i][cel_j]=='*'){
                           contagem[i][j]++;
                        }
                    }
                 }
              }
           }
        }
    }
}


int main()
{
    int n_lin,n_col;

    char ** bombas = ler_matriz((char*)"bombas.txt",&n_lin,&n_col);
    int ** contagem = alocar_matriz_int(n_lin,n_col);
    computar_contagem(bombas,contagem,n_lin,n_col);
    imprimir_matriz_char(bombas,n_lin,n_col);
    imprimir_matriz_int(contagem,n_lin,n_col);


    return 0;
}
