3124 - Patrat Magic 0

De la Universitas MediaWiki

Enunt

Un Pătrat Magic este un pătrat ce conține numerele de la 1 la 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

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