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