Un carré magique est une grille carrée dans laquelle des nombres sont placés de telle sorte que la somme des nombres de chaque colonne, chaque ligne et de chacune des deux diagonales soit la même. De plus, Le carré doit contenir une fois chaque nombre, de 1 au nombre de cases de la grille.
Écrivez un programme qui vérifie si une grille de nombres est un carré magique.
La première ligne de l'entrée contient un entier : le nombre de cases du côté de la grille de nombres.
Chacune des lignes suivantes contient entiers séparés par des espaces : les nombres d'une ligne de la grille.
Vous devez afficher une ligne sur la sortie, contenant le mot yes
si le carré fourni est un carré magique, et no
sinon.
entrée :
3
6 1 8
7 5 3
2 9 4
sortie :
yes
Chacun des chiffres de à apparaît exactement une fois dans la grille. De plus, toutes les colonnes, lignes et les deux diagonales de cette grille ont pour somme . En effet :
Lignes :
Colonnes :
Diagonales :
def est_magique(n: int, grille: list) -> bool: """Une grille de taille n est-elle magique ? """ somme = sum(grille[0]) # la somme de la première ligne # les autres lignes ? if any(sum(ligne) != somme for ligne in grille): return False # les autres colonnes ? if any(sum(grille[i][j] for i in range(n)) != somme for j in range(n)): return False # les diagonales ? if sum(grille[i][i] for i in range(n)) != somme: return False if sum(grille[i][-i-1] for i in range(n)) != somme: return False # tous les nombres de 1 à n² sont-ils présents ? # On enlève 1, pour un indice dans un tableau n_carré = n * n déjà_vu = [False for _ in range(n_carré)] for i in range(n): for j in range(n): if 0 < grille[i][j] <= n_carré: if déjà_vu[grille[i][j] - 1]: return False déjà_vu[grille[i][j] - 1] = True else: return False # Alors tout est bon, le carré est magique return True n = int(input()) grille = [list(map(int, input().split())) for _ in range(n)] print('yes' if est_magique(n, grille) else 'no')