3124 - Patrat Magic 0

From Bitnami MediaWiki

Enunt

Un Pătrat Magic este un pătrat ce conține numerele de la 1 la <math>n^2 în care sumele fiecăror linii, coloane și a celor două diagonale sunt egale. Această sumă se mai numește și constanta pătratului magic.

Cerința

Se dă un număr natural n, urmat de o matrice pătratică cu n * n elemente, numere naturale. Să se verifice dacă matricea dată este un pătrat magic.

Date de intrare

Programul citește de la tastatură numărul n, iar apoi n * n numere naturale, reprezentând elementele matricei.

Date de ieșire

Programul va afișa pe ecran true dacă matricea dată este un pătrat magic sau false dacă nu este.

Restricții și precizări

  • 3 ⩽ n ⩽ 500
  • cele n numere citite vor fi mai mici sau egale decât 250.000

Exemplu 1

Intrare
3
4 9 2
3 5 7
8 1 6
Ieșire
true


Exemplu 2

Intrare
3
1 2 3
1 2 3
0 9 1
Iesire
false

Exemplu 3

Intrare
2
Ieșire
Nu au fost respectate cerintele impuse


Rezolvare

<syntaxhighlight lang="python" line>

  1. 3124 - PatratMagic0

def is_magic_square(n, matrix):

   # Verificare daca elementele matricei sunt distincte
   distinct_numbers = set()
   for row in matrix:
       for num in row:
           if num <= 0 or num > n ** 2 or num in distinct_numbers:
               return False
           distinct_numbers.add(num)
   # Calcularea constantei magice
   magic_constant = n * (n ** 2 + 1) // 2
   # Verificare sume pe linii
   for row in matrix:
       if sum(row) != magic_constant:
           return False
   # Verificare sume pe coloane
   for j in range(n):
       if sum(matrix[i][j] for i in range(n)) != magic_constant:
           return False
   # Verificare suma pe diagonala principala
   if sum(matrix[i][i] for i in range(n)) != magic_constant:
       return False
   # Verificare suma pe diagonala secundara
   if sum(matrix[i][n - i - 1] for i in range(n)) != magic_constant:
       return False
   return True


def main():

   try:
       # Citirea datelor de intrare
       n = int(input("Introduceti n: "))
       if not (3 <= n <= 500):
           raise ValueError("Nu a fost respectata restrangerea pentru n.")
       matrix = []
       print("Introduceti elementele matricei:")
       for _ in range(n):
           row = list(map(int, input().split()))
           if len(row) != n or any(num > 250000 for num in row):
               raise ValueError("Nu au fost respectate cerintele impuse.")
           matrix.append(row)
       # Verificarea daca matricea este un patrat magic
       result = is_magic_square(n, matrix)
       # Afisarea rezultatului
       print(result)
   except ValueError as e:
       print(f"Nu au fost respectate cerintele impuse: {e}")


if __name__ == "__main__":

   main()

</syntaxhighlight>