1888 - Cartonase

De la Universitas MediaWiki

Cerinta

Vlad este pasionat de jocuri și vrea să vă propună unul. Pe o tablă cu n linii și m coloane, inițial goală, se așază la fiecare mutare un cartonaș în căsuța de coordonate x și y cu un număr pe el reprezentând numărul de vecini (Nord, Sud, Est, Vest) deja completați. Primul cartonaș pus este 0 deoarece nu este nimic completat încă. Întrebarea este care este suma tuturor numerelor de pe cartonașele așezate pe tabla după ce aceasta este completată?

Date de intrare

Fișierul de intrare cartonasein.txt conține pe prima linie numerele n și m, și pe următoarele n*m linii câte o pereche de numere x și y cu semnificația că se pune un cartonaș în căsuța cu aceste coordonate.

Date de iesire

Fișierul de ieșire cartonaseout.txt va conține pe prima linie numărul S, reprezentând suma numerelor de pe cartonașe.

Restrictii si precizari

  • 1 ⩽ n, m ⩽ 10.000

Exemplul 1

cartonasein.txt
2 5
2 4
2 5
1 1
1 3
1 5
2 2
1 4
1 2
2 3
2 1


Datele introduse corespund restrictiilor impuse
cartonaseout.txt
13

Exemplul 2

cartonasein.txt
3 4
-5 6
1 1
0 5
9 -3
-10 -6


Datele introduse nu corespund restrictiilor impuse


Rezolvare

def este_input_valid(n, m, cartonase):
    if not (1 <= n <= 10000 and 1 <= m <= 10000):
        return False

    for x, y in cartonase:
        if not (1 <= x <= n and 1 <= y <= m):
            return False

    return True

# Citire date de intrare
with open("cartonasein.txt", "r") as f:
    n, m = map(int, f.readline().split())
    cartonase = [tuple(map(int, f.readline().split())) for _ in range(n * m)]

# Verificare validitate date de intrare
if not este_input_valid(n, m, cartonase):
    print("Datele introduse nu corespund restricțiilor impuse.")
else:
    # Inițializare matrice
    tabla = [[0] * m for _ in range(n)]

    # Parcurgere și actualizare valori pentru fiecare cartonaș
    for x, y in cartonase:
        tabla[x - 1][y - 1] = 1  # Se pune cartonașul pe tabla

        # Se actualizează vecinii
        if x > 1:
            tabla[x - 2][y - 1] += 1  # Vecinul din Nord
        if x < n:
            tabla[x][y - 1] += 1  # Vecinul din Sud
        if y > 1:
            tabla[x - 1][y - 2] += 1  # Vecinul din Vest
        if y < m:
            tabla[x - 1][y] += 1  # Vecinul din Est

    # Calcul suma numerelor de pe cartonașe
    suma = sum(tabla[i][j] for i in range(n) for j in range(m))

    # Scriere rezultat în fișierul de ieșire
    with open("cartonaseout.txt", "w") as f:
        f.write(str(suma) + "\n")

Explicatie

Suma cartonașelor este 13.