Aula 16: Exercícios de revisão da parte 2

Tópicos

Problema 1:

Dizemos que uma matriz A de dimensão n x n é um quadrado latino de ordem n se em cada linha e em cada coluna aparecem todos os inteiros 1,2,3,...,n (ou seja, cada linha e coluna é permutação dos inteiros 1,2,...,n). Por exemplo, veja o quadrado latino abaixo.

A = [ [1,2,3],
      [2,3,1],
      [3,1,2] ]

(a) Escreva uma função que recebe como parâmetro uma lista L com n inteiros e verifica se em L ocorrem todos os inteiros de 1 a n.

(b) Usando a função acima, verifique se uma dada matriz inteira A de dimensão n x n é um quadrado latino de ordem n.

def leitura_matriz(nlinhas, ncolunas):
    M = []
    for i in range(nlinhas):
        linha = []
        for j in range(ncolunas):
            valor = int(input("(%d,%d):"%(i,j)))
            linha.append(valor)
        M.append(linha)
    return M

def lista_latina(L):
    for i in range(1,len(L)+1,1):
        if i not in L:
            return False
    return True

def main():
    n = int(input("Digite n: "))
    A = leitura_matriz(n, n)
    latino = True

    #Testa linhas:
    for i in range(len(A)):
        if not lista_latina(A[i]):
            latino = False

    #Testa colunas:
    for j in range(len(A[0])):
        C = []
        for i in range(len(A)):
            C.append(A[i][j])
        if not lista_latina(C):
            latino = False
    if latino:
        print("Quadrado latino")
    else:
        print("Não é quadrado latino")

main()
  

Problema 2:

Dizemos que uma matriz quadrada inteira é um quadrado mágico se a soma dos elementos de cada linha, a soma dos elementos de cada coluna e a soma dos elementos das diagonais principal e secundária são todas iguais.

Por exemplo, a matriz abaixo é um quadrado mágico.

A = [ [8,  0, 7],
      [4,  5, 6],
      [3, 10, 2] ]

Dada uma matriz quadrada A de dimensão n x n, verificar se A é um quadrado mágico.

Solução 1:

Testa a soma das linhas, colunas e diagonais em laços separados. Para a soma das linhas usa a função sum() disponível no Python que gera a soma dos elementos de uma lista fornecida.

def leitura_matriz(nlinhas, ncolunas):
    M = []
    for i in range(nlinhas):
        linha = []
        for j in range(ncolunas):
            valor = int(input("(%d,%d):"%(i,j)))
            linha.append(valor)
        M.append(linha)
    return M

def main():
    n = int(input("Digite n: "))
    A = leitura_matriz(n, n)
    magico = True

    soma_esperada = sum(A[0])
    #Testa linhas:
    for i in range(1,len(A)):
        if sum(A[i]) != soma_esperada:
            magico = False
    
    #Testa colunas:
    for j in range(len(A[0])):
        soma = 0
        for i in range(len(A)):
            soma += A[i][j]
        if soma != soma_esperada:
            magico = False

    #Diagonal principal:
    soma = 0
    for i in range(len(A)):
        soma += A[i][i]
    if soma != soma_esperada:
        magico = False

    #Diagonal secundária:
    soma = 0
    j = n-1
    for i in range(len(A)):
        soma += A[i][j]
        j -= 1
    if soma != soma_esperada:
        magico = False

    if magico:
        print("Quadrado mágico")
    else:
        print("Não é quadrado mágico")

main()

Solução 2:

Usa uma lista soma_linhas para armazenar a soma de cada linha e uma lista soma_colunas para a soma das colunas. Ou seja, no final, soma_linhas[i] armazenará a soma dos elementos da i-ésima linha e soma_colunas[j] a soma dos elementos da j-ésima coluna. Todas as somas de linhas, colunas e diagonais são então calculadas dentro da mesma estrutura de laços encaixados.

def leitura_matriz(nlinhas, ncolunas):
    M = []
    for i in range(nlinhas):
        linha = []
        for j in range(ncolunas):
            valor = int(input("(%d,%d):"%(i,j)))
            linha.append(valor)
        M.append(linha)
    return M

def main():
    n = int(input("Digite n: "))
    A = leitura_matriz(n, n)
    magico = True

    soma_linhas = [0]*n
    soma_colunas = [0]*n
    soma_diag_pri = 0
    soma_diag_sec = 0
    for i in range(n):
        for j in range(n):
            soma_linhas[i] += A[i][j]
            soma_colunas[j] += A[i][j]
            if i == j:
                soma_diag_pri += A[i][j]
            if i+j == n-1:
                soma_diag_sec += A[i][j]

    soma_esperada = soma_diag_pri
    if soma_esperada != soma_diag_sec:
        magico = False
    for i in range(n):
        if soma_linhas[i] != soma_esperada:
            magico = False
        if soma_colunas[i] != soma_esperada:
            magico = False

    if magico:
        print("Quadrado mágico")
    else:
        print("Não é quadrado mágico")

main()