1888 - Cartonase: Difference between revisions
No edit summary |
|||
(One intermediate revision by the same user not shown) | |||
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"> | ||
def | 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)] | tabla = [[0] * m for _ in range(n)] | ||
for x, y in | # 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") | |||
</syntaxhighlight> | </syntaxhighlight> | ||
Latest revision as of 11:26, 29 December 2023
Cerinta[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
- 1 ⩽ n, m ⩽ 10.000
Exemplul 1[edit | edit source]
- 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[edit | edit source]
- cartonasein.txt
- 3 4
- -5 6
- 1 1
- 0 5
- 9 -3
- -10 -6
- Datele introduse nu corespund restrictiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python3" line="1"> 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")
</syntaxhighlight>
Explicatie[edit | edit source]
Suma cartonașelor este 13.