3646 - Zoom poza: Difference between revisions

From Bitnami MediaWiki
Cerinta + rezolvare
 
nume variabile
 
(One intermediate revision by the same user not shown)
Line 48: Line 48:
<syntaxhighlight lang="python3">
<syntaxhighlight lang="python3">
import numpy as np
import numpy as np


def main():
def main():
     fin = open("zoom_poza.in", "r")
     fin = open("zoom_poza.in", "r")
     fout = open("zoom_poza.out", "w") # deschidem fisierele input si output
     fout = open("zoom_poza.out", "w")


     c = int(fin.readline())
     numar_c = int(fin.readline())
    fout.write(str(c))


     if c == 1:
     if numar_c == 1:
         process_case_1(fin, fout)
         caz_1(fin, fout)
     elif c == 2:
     elif numar_c == 2:
         process_case_2(fin, fout)
         caz_2(fin, fout)


    fin.close()
    fout.close()


def process_case_1(fin, fout):
def caz_1(fin, fout):
     a = np.zeros((71, 71), dtype=int)
     numar_n, numar_m = map(int, fin.readline().split())  # citim numerele n, m
     n, m, z = map(int, fin.readline().split())
    numar_z = int(fin.readline())  # citim numar z
    for i in range(1, m+1):
    numar_a = np.zeros((numar_n, numar_m), dtype=int)
        a[i][j] = int(fin.readline())  # inlocuim j cu i
     for i in range(numar_n):
     b = np.zeros((701, 701), dtype=int)
        line = fin.readline().split()
     for i in range(1, n+1):
        for j in range(numar_m):
         constanta = 0 # Initializam constanta
            numar_a[i][j] = int(line[j])  # citim matricea initiala
         for j in range(1, m+1):
     numar_b = np.zeros((numar_n * numar_z, numar_m * numar_z), dtype=int)
             for x in range(1, z+1):
     for i in range(numar_n):
                 for x1 in range(1, z+1):
         constanta = 0
                     b[(i - 1) * z + x1][constanta * z + x] = a[i][j]
         for j in range(numar_m):
        constanta += 1
             for numar_x in range(numar_z):
     for i in range(1, z * m + 1):
                 for numar_y in range(numar_z):
         for j in range(1, z * m + 1):
                     numar_b[i * numar_z + numar_y][
             fout.write(str(b[i][j]) + " ")
                        constanta * numar_z + numar_x
                    ] = numar_a[i][j]
                    # se creeaza matricea marita de z ori
            constanta += 1
     for i in range(0, numar_z * numar_n):
         for j in range(0, numar_z * numar_m):
             fout.write(str(numar_b[i][j]) + " ") # scriem in fisier matricea rezultata
         fout.write("\n")
         fout.write("\n")


def process_case_2(fin, fout):
 
     n, m, z = map(int, fin.readline().split())
def caz_2(fin, fout):
     b = np.zeros((701, 701), dtype=int)
     numar_n, numar_m = map(int, fin.readline().split()) # citim numerele n, m
     for i in range(1, n+1):
     numar_z = int(fin.readline())  # citim z
         for j in range(1, m+1):
    numar_a = np.zeros((numar_n, numar_m), dtype=int)
             b[i][j] = int(fin.readline())
     for i in range(numar_n):
     k = int(fin.readline())
        line = fin.readline().split()
     for _ in range(k):
         for j in range(numar_m):
         l1, c1 = map(int, fin.readline().split())
             numar_a[i][j] = int(line[j]) # citim matricea initiala
         linie = l1 // z
     numar_k = int(fin.readline()) # citim numarul k
         if l1 % z != 0:
     for i in range(numar_k):
             linie += 1
         linia1, coloana1 = map(int, fin.readline().split()) # citim linia 1, coloana 1
         coloana = c1 // z
         line = linia1 / numar_z
         if c1 % z != 0:
         if linia1 % numar_z != 0:
             coloana += 1
             line += 1
         fout.write(str(b[linie][coloana]) + " ")
         column = coloana1 / numar_z
         if coloana1 % numar_z != 0:
             column += 1
         fout.write(
            str(numar_a[int(line - 1)][int(column - 1)]) + " "
        ) # scriem in fisier valoarea de
        # pe pozitia ceruta
 


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

Latest revision as of 22:01, 12 January 2024

Cerința[edit | edit source]

În orașul Detroit s-a produs o spargere la un magazin de bijuterii. Infractorii au fugit de la locul faptei, iar polițiștii au reusit să facă rost doar de o poză neclară cu infractorii.

Cu ajutorul inteligenței artificiale reușesc să mărească acea imagine pentru a găsi niște detalii pentru a-i ajuta la rezolvarea cazului. Fii de partea binelui și ajută-i pe polițiști să rezolve acest caz!

Poza este reprezentată printr-o matrice cu n linii și m coloane, alcătuită din numere naturale. Polițiștii te roagă să-i ajuți, răspunzând la următoarele întrebări:

1) Dându-se o matrice reprezentând poza și un coeficient de mărire z, construiește o altă matrice care să reprezinte poza mărită de z ori.

2) Dându-se o matrice reprezentând poza, coeficientul de mărire z și un șir perechi de coordonate din poza mărită, determină pentru fiecare pereche de coordonate valoarea din poza mărită.

Date de intrare[edit | edit source]

Fișierul de intrare zoom_poza.in conține pe prima linie numărul c, reprezentând întrebarea la care trebuie să răspunzi.

Pentru c=1 pe a doua linie se află numărul de linii n și numărul de coloane m, pe a treia linie factorul de al imaginii z, iar pe următoarele n linii și m coloane poza sub forma unei matrici.

Pentru c=2 pe a doua linie se află numărul de linii n și numărul de coloane m, pe a treia linie factorul de al imaginii z, iar pe următoarele n linii și m coloane poza sub forma unei matrici. Pe a patra linie se află k – numărul de perchi de coordonate, iar pe următoarele k linii câte două numere l1 c1, reprezentând numărul de ordine al liniei, respectiv al coloanei pentru elementul cerut din matricea finală.

Date de ieșire[edit | edit source]

Fișierul de ieșire zoom_poza.out va conține:

  • pentru c=1 imaginea mărită de către program, în dimensiune de n*z linii și m*z coloane.
  • pentru c=2 se vor afișa numerele aflate pe pozițiile date în poza mărită, separate printr-un spațiu.

Restricții și precizări[edit | edit source]

  • Pentru c=1:
    • 1 ≤ n ≤ m ≤ 70
    • 1 ≤ a[i][j] ≤ 100.000
    • 1 ≤ z ≤ 10
    • Pentru teste în valoare de 40 de puncte, c=1.
  • Pentru c=2:
    • Pentru 20 de puncte:
      • 1 ≤ n ≤ m ≤ 70
      • 1 ≤ a[i][j] ≤ 100.000
      • 1 ≤ z ≤ 10
      • 1 ≤ k ≤ 1000
      • 1 ≤ l1 ≤ c1 ≤ 2500
    • Pentru 60 de puncte:
      • 1 ≤ n ≤ m ≤ 50
      • 1 ≤ a[i][j] ≤ 9•1018
      • 1 ≤ z ≤ 9•1014
      • 1 ≤ k ≤ 1.000
      • 1 ≤ l1 ≤ c1 ≤ 9•1018
  • Se recomandă evitarea rezolvării din afișare!

<syntaxhighlight lang="python3"> import numpy as np


def main():

   fin = open("zoom_poza.in", "r")
   fout = open("zoom_poza.out", "w")
   numar_c = int(fin.readline())
   if numar_c == 1:
       caz_1(fin, fout)
   elif numar_c == 2:
       caz_2(fin, fout)


def caz_1(fin, fout):

   numar_n, numar_m = map(int, fin.readline().split())  # citim numerele n, m
   numar_z = int(fin.readline())  # citim numar z
   numar_a = np.zeros((numar_n, numar_m), dtype=int)
   for i in range(numar_n):
       line = fin.readline().split()
       for j in range(numar_m):
           numar_a[i][j] = int(line[j])  # citim matricea initiala
   numar_b = np.zeros((numar_n * numar_z, numar_m * numar_z), dtype=int)
   for i in range(numar_n):
       constanta = 0
       for j in range(numar_m):
           for numar_x in range(numar_z):
               for numar_y in range(numar_z):
                   numar_b[i * numar_z + numar_y][
                       constanta * numar_z + numar_x
                   ] = numar_a[i][j]
                   # se creeaza matricea marita de z ori
           constanta += 1
   for i in range(0, numar_z * numar_n):
       for j in range(0, numar_z * numar_m):
           fout.write(str(numar_b[i][j]) + " ")  # scriem in fisier matricea rezultata
       fout.write("\n")


def caz_2(fin, fout):

   numar_n, numar_m = map(int, fin.readline().split())  # citim numerele n, m
   numar_z = int(fin.readline())  # citim z
   numar_a = np.zeros((numar_n, numar_m), dtype=int)
   for i in range(numar_n):
       line = fin.readline().split()
       for j in range(numar_m):
           numar_a[i][j] = int(line[j])  # citim matricea initiala
   numar_k = int(fin.readline())  # citim numarul k
   for i in range(numar_k):
       linia1, coloana1 = map(int, fin.readline().split())  # citim linia 1, coloana 1
       line = linia1 / numar_z
       if linia1 % numar_z != 0:
           line += 1
       column = coloana1 / numar_z
       if coloana1 % numar_z != 0:
           column += 1
       fout.write(
           str(numar_a[int(line - 1)][int(column - 1)]) + " "
       )  # scriem in fisier valoarea de
       # pe pozitia ceruta


if __name__ == "__main__":

   main()

</syntaxhighlight>