#include <stdio.h>
#define NMAX 100
#define TRUE 1
#define FALSE 0

void leia_matriz(int a[][NMAX], int n);
void imprima_matriz(int a[][NMAX], int n);
int pertence(int x, int a[], int n);
int eh_falho(int a[], int n);
int latino(int a[][NMAX], int n);

void copie_coluna(int a[], int b[][NMAX], int j, int n);

int main()
{
  int n, a[NMAX][NMAX];

  scanf("%d", &n);
  leia_matriz(a, n);
  
  if (latino(a, n))
    printf("A matriz 'e um quadrado latino.\n");
  else
    printf("A matriz nao 'e um quadrado latino.\n"); 

  return 0;
}

void leia_matriz(int a[][NMAX], int n)
{
  int i, j;
  for (i = 0; i < n; i++)
    for (j=0; j<n; j++)
      scanf("%d", &a[i][j]);
}

void imprima_matriz(int a[][NMAX], int n)
{
  int i, j;
  for (i = 0; i < n; i++) {
    for (j=0; j<n; j++)
      printf("%d ", a[i][j]);
    printf("\n");
  }
}

int pertence(int x, int a[], int n)
{
  int i;
  for (i=0; i<n; i++)
    if (a[i]==x)
      return TRUE;
  return FALSE;
}

int latino(int a[][NMAX], int n)
{
  int i, j, v[NMAX];

  for (i=0; i<n; i++)
    if (eh_falho(a[i], n))
      return FALSE;

  for (j=0; j<n; j++) {
    copie_coluna(v, a, j, n);
    if (eh_falho(v, n))
      return FALSE;
  }

  return TRUE;
}

void copie_coluna(int a[], int b[][NMAX], int j, int n)
{
  int i;
  for (i=0; i<n; i++)
    a[i]=b[i][j];
}

int eh_falho(int a[], int n)
{
  int i;

  for (i=1; i<=n; i++)
    if (!pertence(i, a, n))
      return TRUE;
  return FALSE;
}
