1888 - Cartonase: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Cerinta ==
== 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ă?
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 ==
== Date de intrare ==


Fișierul de intrare cartonase.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.
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 ==
== Date de iesire ==


Fișierul de ieșire cartonase.txt va conține pe prima linie numărul S, reprezentând suma numerelor de pe cartonașe.
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 ==
== Restrictii si precizari ==


*1 n, m 10.000
*1 ⩽ n, m ⩽ 10.000


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


;Iesire
 
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
;cartonaseout.txt
:13
:13


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


;Iesire
 
;Datele introduse nu corespund restrictiilor impuse
:Datele introduse nu corespund restrictiilor impuse




== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
def calcul_suma_cartonase(n, m, mutari):
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 mutari:
    # Parcurgere și actualizare valori pentru fiecare cartonaș
         tabla[x][y] += 1  # Incrementăm numărul de vecini pentru căsuța respectivă
     for x, y in cartonase:
 
         tabla[x - 1][y - 1] = 1  # Se pune cartonașul pe tabla
        # Actualizăm vecinii căsuței
        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


    suma = sum(sum(row) for row in tabla)
        # Se actualizează vecinii
    return suma
        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


def main():
     # Calcul suma numerelor de pe cartonașe
     # Citirea datelor de intrare din fișier
     suma = sum(tabla[i][j] for i in range(n) for j in range(m))
     with open("cartonase.txt", "r") as f:
        n, m = map(int, f.readline().split())
        mutari = [tuple(map(int, f.readline().split())) for _ in range(n * m)]


     # Calcularea și afișarea rezultatului
     # Scriere rezultat în fișierul de ieșire
     rezultat = calcul_suma_cartonase(n, m, mutari)
     with open("cartonaseout.txt", "w") as f:
        f.write(str(suma) + "\n")


    # Scrierea rezultatului în fișierul de ieșire
    with open("cartonase.txt", "w") as g:
        g.write(str(rezultat))


if __name__ == "__main__":
    main()
</syntaxhighlight>
</syntaxhighlight>



Latest revision as of 11:26, 29 December 2023

Cerinta[edit]

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]

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]

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]

  • 1 ⩽ n, m ⩽ 10.000

Exemplul 1[edit]

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]

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


Datele introduse nu corespund restrictiilor impuse


Rezolvare[edit]

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

Suma cartonașelor este 13.