1888 - Cartonase: Difference between revisions
No edit summary |
No edit summary |
||
Line 16: | Line 16: | ||
== Exemplul 1 == | == Exemplul 1 == | ||
;cartonasein.txt | ;cartonasein.txt | ||
:2 5 | :2 5 | ||
Line 30: | Line 30: | ||
:2 1 | :2 1 | ||
:Datele introduse corespund restrictiilor impuse | :Datele introduse corespund restrictiilor impuse | ||
;cartonaseout.txt | ;cartonaseout.txt | ||
Line 36: | Line 36: | ||
== Exemplul 2 == | == Exemplul 2 == | ||
;cartonasein.txt | ;cartonasein.txt | ||
:3 4 | :3 4 | ||
Line 45: | Line 45: | ||
:-10 -6 | :-10 -6 | ||
:Datele introduse nu corespund restrictiilor impuse | :Datele introduse nu corespund restrictiilor impuse | ||
Line 51: | Line 51: | ||
== Rezolvare == | == Rezolvare == | ||
<syntaxhighlight lang="python3" line="1"> | <syntaxhighlight lang="python3" line="1"> | ||
# 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)] | |||
# Inițializare matrice | |||
tabla = [[0] * m for _ in range(n)] | |||
# Parcurgere și actualizare valori pentru fiecare cartonaș | |||
for x, y in cartonase: | |||
tabla[x][y] = 1 # Se pune cartonașul pe tabla | |||
# Se actualizează vecinii | |||
# | if x > 0: | ||
tabla[x - 1][y] += 1 # Vecinul din Nord | |||
if x < n - 1: | |||
tabla[x + 1][y] += 1 # Vecinul din Sud | |||
if y > 0: | |||
tabla[x][y - 1] += 1 # Vecinul din Vest | |||
if y < m - 1: | |||
tabla[x][y + 1] += 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") | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Revision as of 09:21, 27 December 2023
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
<syntaxhighlight lang="python3" line="1">
- 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)]
- Inițializare matrice
tabla = [[0] * m for _ in range(n)]
- Parcurgere și actualizare valori pentru fiecare cartonaș
for x, y in cartonase:
tabla[x][y] = 1 # Se pune cartonașul pe tabla
# Se actualizează vecinii if x > 0: tabla[x - 1][y] += 1 # Vecinul din Nord if x < n - 1: tabla[x + 1][y] += 1 # Vecinul din Sud if y > 0: tabla[x][y - 1] += 1 # Vecinul din Vest if y < m - 1: tabla[x][y + 1] += 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")
</syntaxhighlight>
Explicatie
Suma cartonașelor este 13.