1888 - Cartonase: Difference between revisions

From Bitnami MediaWiki
No edit summary
 
(One intermediate revision by the same user not shown)
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):
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("cartonasein.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("cartonaseout.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 | 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
  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 | edit source]

Suma cartonașelor este 13.