/* 
 * Este programa resolve o seguinte problema do caderno de exercicios:
 * 
 * Um jogo de palavras cruzadas pode ser representado por uma matriz A (m por n) 
 * onde cada posição da matriz corresponde a um quadrado do jogo, sendo que 0
 * indica um quadrado branco e -1 indica um quadrado preto.  Indicar na matriz
 * (enumerando a partir de 1) as posições que são início de
 * palavras horizontais e/ou verticais com pelo menos 2 letras.  Para isso,
 * percorra a matriz em ordem de linha, e vá enumerando essas posições
 * consecutivamente a partir de 1 (substituindo o zero aí presente). 
 * 
 * Exemplo: suponha que a entrada seja 
 * 
 *   0 -1  0 -1 -1  0 -1  0
 *   0  0  0  0 -1  0  0  0
 *   0  0 -1 -1  0  0 -1  0
 *  -1  0  0  0  0 -1  0  0
 *   0  0 -1  0  0  0 -1 -1
 * 
 * A saida deve entao ser
 * 
 *   1 -1  2 -1 -1  3 -1  4
 *   5  6  0  0 -1  7  0  0
 *   8  0 -1 -1  9  0 -1  0
 *  -1 10  0 11  0 -1 12  0
 *  13  0 -1 14  0  0 -1 -1
 */
#include <stdio.h>

#define TRUE 1
#define FALSE 0

#define MMAX 20
#define NMAX 20

/************************************************************/

void leia_matriz(int a[][NMAX], int m, int n);
void imprima_matriz(int a[][NMAX], int m, int n);
void insira_borda(int a[][NMAX], int m, int n);

int eh_comeco(int a[][MMAX], int i, int j);
void rotule_matriz(int a[][MMAX], int m, int n);

/************************************************************/

int main()
{
  int m, n;
  int PC[NMAX][MMAX];

  scanf("%d %d", &m, &n);
  
  leia_matriz(PC, m, n);
  insira_borda(PC, m, n);
  rotule_matriz(PC, m, n);
  imprima_matriz(PC, m, n);

  return 0;
}

/************************************************************/

void leia_matriz(int a[][NMAX], int m, int n)
{
  int i, j;

  printf("Forneca as entradas da matriz %d x %d:\n", m, n);
  for (i=1; i<=m; i++)
    for (j=1; j<=n; j++)
      scanf("%d", &a[i][j]);
}

void imprima_matriz(int a[][NMAX], int m, int n)
{
  int i, j;

  printf("\nOs elementos da matriz sao\n\n");
  for (i=1; i<=m; i++) {
    for (j=1; j<=n; j++)
      printf("%3d", a[i][j]);
    printf("\n");
  }
  printf("\n");
}

void insira_borda(int a[][NMAX], int m, int n)
{
  int i, j;

  for (i=0; i<=m+1; i++) 
    a[i][0]=a[i][n+1]=-1;
  for (j=0; j<=n+1; j++)
    a[0][j]=a[m+1][j]=-1;
}
  
int eh_comeco(int a[][MMAX], int i, int j)
{
  if (a[i][j]!=0)
    return FALSE;
  
  /* comeco de palavra horizontal */
  if ((a[i][j-1]==-1) && (a[i][j+1]==0))
    return TRUE;

  /* comeco de palavra vertical */
  if ((a[i-1][j]==-1) && (a[i+1][j]==0))
    return TRUE;

  return FALSE;

}

void rotule_matriz(int a[][MMAX], int m, int n)
{
  int i, j, k=0;

  for (i=1; i<=m; i++)
    for (j=1; j<=n; j++)
      if (eh_comeco(a, i, j)) {
	k++;
	a[i][j]=k;
      }
}

/************************************************************/