1888 - Cartonase: Difference between revisions

From Bitnami MediaWiki
No edit summary
No edit summary
Line 16: Line 16:


== Exemplul 1 ==
== Exemplul 1 ==
;Intrare
 
;cartonasein.txt
;cartonasein.txt
:2 5
:2 5
Line 30: Line 30:
:2 1
:2 1


;Iesire
 
:Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
;cartonaseout.txt
;cartonaseout.txt
Line 36: Line 36:


== Exemplul 2 ==
== Exemplul 2 ==
;Intrare
 
;cartonasein.txt
;cartonasein.txt
:3 4
:3 4
Line 45: Line 45:
:-10 -6
:-10 -6


;Iesire
 
: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 calcul_suma_cartonase(n, m, mutari):
# Citire date de intrare
     tabla = [[0] * m for _ in range(n)]
with open("cartonasein.txt", "r") as f:
 
    n, m = map(int, f.readline().split())
    for x, y in mutari:
     cartonase = [tuple(map(int, f.readline().split())) for _ in range(n * m)]
        tabla[x][y] += 1  # Incrementăm numărul de vecini pentru căsuța respectivă


        # Actualizăm vecinii căsuței
# Inițializare matrice
        if x > 0:
tabla = [[0] * m for _ in range(n)]
            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


    suma = sum(sum(row) for row in tabla)
# Parcurgere și actualizare valori pentru fiecare cartonaș
     return suma
for x, y in cartonase:
     tabla[x][y] = 1  # Se pune cartonașul pe tabla


def main():
    # Se actualizează vecinii
     # Citirea datelor de intrare din fișier
    if x > 0:
     with open("cartonasein.txt", "r") as f:
        tabla[x - 1][y] += 1  # Vecinul din Nord
         n, m = map(int, f.readline().split())
     if x < n - 1:
         mutari = [tuple(map(int, f.readline().split())) for _ in range(n * m)]
        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


    # Calcularea și afișarea rezultatului
# Calcul suma numerelor de pe cartonașe
    rezultat = calcul_suma_cartonase(n, m, mutari)
suma = sum(tabla[i][j] for i in range(n) for j in range(m))


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


if __name__ == "__main__":
    main()
</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">

  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)]
  1. Inițializare matrice

tabla = [[0] * m for _ in range(n)]

  1. 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
  1. Calcul suma numerelor de pe cartonașe

suma = sum(tabla[i][j] for i in range(n) for j in range(m))

  1. 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.