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()
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()