3646 - Zoom poza: Difference between revisions
Cerinta + rezolvare |
No edit summary |
||
| 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") | fout = open("zoom_poza.out", "w") | ||
c = int(fin.readline()) | c = int(fin.readline()) | ||
if c == 1: | if c == 1: | ||
| Line 60: | Line 58: | ||
elif c == 2: | elif c == 2: | ||
process_case_2(fin, fout) | process_case_2(fin, fout) | ||
def process_case_1(fin, fout): | def process_case_1(fin, fout): | ||
a = np.zeros(( | n, m = map(int, fin.readline().split()) # citim n, m | ||
n | z = int(fin.readline()) # citim z | ||
a = np.zeros((n, m), dtype=int) | |||
for i in range(n): | |||
b = np.zeros(( | line = fin.readline().split() | ||
for i in range( | for j in range(m): | ||
constanta = 0 | a[i][j] = int(line[j]) # citim matricea initiala | ||
for j in range( | b = np.zeros((n * z, m * z), dtype=int) | ||
for x in range( | for i in range(n): | ||
for | constanta = 0 | ||
b[ | for j in range(m): | ||
for x in range(z): | |||
for i in range( | for y in range(z): | ||
for j in range( | b[i * z + y][constanta * z + x] = a[i][ | ||
fout.write(str(b[i][j]) + " ") | j | ||
] # se creeaza matricea marita de z ori | |||
constanta += 1 | |||
for i in range(0, z * n): | |||
for j in range(0, z * m): | |||
fout.write(str(b[i][j]) + " ") # scriem in fisier matricea rezultata | |||
fout.write("\n") | fout.write("\n") | ||
def process_case_2(fin, fout): | def process_case_2(fin, fout): | ||
n, m | n, m = map(int, fin.readline().split()) # citim n, m | ||
z = int(fin.readline()) # citim z | |||
for i in range( | a = np.zeros((n, m), dtype=int) | ||
for j in range( | for i in range(n): | ||
line = fin.readline().split() | |||
k = int(fin.readline()) | for j in range(m): | ||
for | a[i][j] = int(line[j]) # citim matricea initiala | ||
l1, c1 = map(int, fin.readline().split()) | k = int(fin.readline()) # citim k | ||
for i in range(k): | |||
l1, c1 = map(int, fin.readline().split()) # citim l1, c1 | |||
line = l1 / z | |||
if l1 % z != 0: | if l1 % z != 0: | ||
line += 1 | |||
column = c1 / z | |||
if c1 % z != 0: | if c1 % z != 0: | ||
column += 1 | |||
fout.write(str( | fout.write(str(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> | ||
Revision as of 20:14, 11 January 2024
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=1imaginea mărită de către program, în dimensiune den*zlinii șim*zcoloane. - pentru
c=2se 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 ≤ 701 ≤ a[i][j] ≤ 100.0001 ≤ z ≤ 10- Pentru teste în valoare de 40 de puncte,
c=1.
- Pentru
c=2:- Pentru 20 de puncte:
1 ≤ n ≤ m ≤ 701 ≤ a[i][j] ≤ 100.0001 ≤ z ≤ 101 ≤ k ≤ 10001 ≤ l1 ≤ c1 ≤ 2500
- Pentru 60 de puncte:
1 ≤ n ≤ m ≤ 501 ≤ a[i][j] ≤ 9•10181 ≤ z ≤ 9•10141 ≤ k ≤ 1.0001 ≤ l1 ≤ c1 ≤ 9•1018
- Pentru 20 de puncte:
- 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")
c = int(fin.readline())
if c == 1:
process_case_1(fin, fout)
elif c == 2:
process_case_2(fin, fout)
def process_case_1(fin, fout):
n, m = map(int, fin.readline().split()) # citim n, m
z = int(fin.readline()) # citim z
a = np.zeros((n, m), dtype=int)
for i in range(n):
line = fin.readline().split()
for j in range(m):
a[i][j] = int(line[j]) # citim matricea initiala
b = np.zeros((n * z, m * z), dtype=int)
for i in range(n):
constanta = 0
for j in range(m):
for x in range(z):
for y in range(z):
b[i * z + y][constanta * z + x] = a[i][
j
] # se creeaza matricea marita de z ori
constanta += 1
for i in range(0, z * n):
for j in range(0, z * m):
fout.write(str(b[i][j]) + " ") # scriem in fisier matricea rezultata
fout.write("\n")
def process_case_2(fin, fout):
n, m = map(int, fin.readline().split()) # citim n, m
z = int(fin.readline()) # citim z
a = np.zeros((n, m), dtype=int)
for i in range(n):
line = fin.readline().split()
for j in range(m):
a[i][j] = int(line[j]) # citim matricea initiala
k = int(fin.readline()) # citim k
for i in range(k):
l1, c1 = map(int, fin.readline().split()) # citim l1, c1
line = l1 / z
if l1 % z != 0:
line += 1
column = c1 / z
if c1 % z != 0:
column += 1
fout.write(str(a[int(line - 1)][int(column - 1)]) + " ")#scriem in fisier valoarea de
# pe pozitia ceruta
if __name__ == "__main__":
main()
</syntaxhighlight>