'''
   Dada uma matriz inteira a com n linhas e n colunas, 
   verificar se a matriz a eh um quadrado magico.
'''

def main():
    a = le_matriz()
    
    imprime_matriz(a)
    
    print()
    if matriz_quadrado_magico(a):
        print("A matriz eh um quadrado magico.")
    else:
        print("A matriz nao eh um quadrado magico.")
        
#-------------------------------------------------------------------------

def le_matriz():
    ''' ( ) -> matriz 

    Le do teclado o numero nlin de linhas, o numero ncol de colunas,
    e os elementos (inteiros) de uma matriz de dimensao (nlin x ncol).
    A funcao cria e retorna a matriz lida.
    '''
    
    nlin = int(input("Digite o numero de linhas: "))
    ncol = int(input("Digite o numero de colunas: "))

    # ler e criar a lista matriz (nlin x ncol)
    
    matriz = [] # lista vazia
    for i in range(nlin):
        # cria a linha i
        linha = [] # cria lista vazia chamada linha
        print ("Digite os numeros da %da. linha:" %(i)) 
        for j in range(ncol):
            elemento = int(input( )) # se preferir:  int(input("Digite um inteiro para a"
                                     #                 "posicao [%d][%d]: " %(i, j)))
            linha.append(elemento)
        # adiciona a lista linha em matriz 
        matriz.append(linha)
    
    return matriz

#-----------------------------------------------------------------

def imprime_matriz(matriz):
    ''' (matriz) -> NoneType

    Recebe e imprime uma matriz de inteiros.
    '''
    
    nlin = len(matriz)
    ncol = len(matriz[0])
    
    print()
    print("Matriz com %d linhas e %d colunas" %(nlin, ncol))
    print()

    for i in range(nlin):
        for j in range(ncol):
            print ("%5d" %(matriz[i][j]), end=' ') ## formato para numeros de poucos digitos; mudar, se necessario.
        print()  
    print()

#---------------------------------------------------------------

def matriz_quadrado_magico(matriz):
    ''' (matriz) -> bool

    Recebe uma matriz e retorna True se a matriz eh um quadrado magico;
    em caso contrario, retorna False.
    Obs. A funcaoo supoe que a matriz eh quadrada.
    '''

    n = len(matriz)

    # determina a soma s1 dos elementos da diagonal principal
    s1 = 0
    i = 0
    while i < n:
        s1 += matriz[i][i]
        i += 1
        
    # determina a soma s2 dos elementos da diagonal secundaria
    s2 = 0
    for i in range(n):
        s2 += matriz[i][n-1-i]

    Ehmagico = s1 == s2     # Ehmagico recebe True se s1 = s2
 
    # verificar se a soma dos elementos de cada linha eh igual a s1
    i = 0
    while i < n and Ehmagico:
        # determina a soma dos elementos da linha i
        soma = 0
        for j in range(n): 
            soma +=  matriz[i][j]
            
        if soma != s1:
            Ehmagico = False
        else:    
            i += 1

    # verificar se a soma dos elementos de cada coluna eh igual a s1
    j = 0
    while j < n and Ehmagico:
        # determina a soma dos elementos da coluna j
        soma = 0
        for i in range(n):
            soma +=  matriz[i][j]
            
        if soma != s1:
            Ehmagico = False
        else:    
            j += 1

    return Ehmagico

#-----------------------------------------------------------------

main()
