3646 - Zoom poza

De la Universitas MediaWiki
Versiunea din 11 ianuarie 2024 16:17, autor: VanceaGabriel (discuție | contribuții) (Cerinta + rezolvare)
(dif) ← Versiunea anterioară | Versiunea curentă (dif) | Versiunea următoare → (dif)

Cerința

Î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

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

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

  • 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!
import numpy as np

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

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

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

    fin.close()
    fout.close()

def process_case_1(fin, fout):
    a = np.zeros((71, 71), dtype=int)
    n, m, z = map(int, fin.readline().split())
    for i in range(1, m+1):
        a[i][j] = int(fin.readline())  # inlocuim j cu i
    b = np.zeros((701, 701), dtype=int)
    for i in range(1, n+1):
        constanta = 0  # Initializam constanta
        for j in range(1, m+1):
            for x in range(1, z+1):
                for x1 in range(1, z+1):
                    b[(i - 1) * z + x1][constanta * z + x] = a[i][j]
        constanta += 1
    for i in range(1, z * m + 1):
        for j in range(1, z * m + 1):
            fout.write(str(b[i][j]) + " ")
        fout.write("\n")

def process_case_2(fin, fout):
    n, m, z = map(int, fin.readline().split())
    b = np.zeros((701, 701), dtype=int)
    for i in range(1, n+1):
        for j in range(1, m+1):
            b[i][j] = int(fin.readline())
    k = int(fin.readline())
    for _ in range(k):
        l1, c1 = map(int, fin.readline().split())
        linie = l1 // z
        if l1 % z != 0:
            linie += 1
        coloana = c1 // z
        if c1 % z != 0:
            coloana += 1
        fout.write(str(b[linie][coloana]) + " ")

if __name__ == "__main__":
    main()