1629 - Qmat
Enunț[edit | edit source]
Spunem că două matrice a și b sunt egale dacă au același număr de linii n și același număr de coloane m și pentru orice pereche de indici i, j (1 ≤ i ≤ n, 1 ≤ j ≤ m) a[i][j] = b[i][j].
Cerința[edit | edit source]
Se dau două seturi de N, respectiv Q matrice binare (cu valori 0 sau 1), pentru fiecare matrice fiind precizat numărul de linii respectiv de coloane. Să se afișeze numărul aparițiilor matricelor din al doilea set în primul.
Date de intrare[edit | edit source]
Fișierul de intrare qmatin.txt conține pe prima linie numărul N, urmat de N matrice, M1, M2, … Mn. Pentru fiecare matrice Mi este precizat, pe o linie, separate printr-un spațiu, numărul de linii li, respectiv de coloane ci, iar pe următoarele li linii câte ci cifre binare separate prin câte un spațiu. După cele N matrice se află și numărul Q urmat de asemenea de Q matrice descrise la fel ca și cele anterioare.
Date de ieșire[edit | edit source]
Fișierul de ieșire qmatout.txt va conține pe prima linie numărul sol, reprezentând numărul de matrice din al doilea set ce apar în primul.
Restricții și precizări[edit | edit source]
- 1 ⩽ n, q ⩽ 10.000
- pentru orice matrice dată 1 ≤ nr. de linii, nr. de coloane ≤ 10
Exemplul 1[edit | edit source]
- Intrare
- qmatin.txt
- 5
- 2 6
- 0 0 0 1 1 1
- 1 0 1 1 0 0
- 7 4
- 0 0 0 1
- 0 0 0 0
- 0 1 1 0
- 0 1 1 0
- 1 1 1 1
- 0 1 0 0
- 0 1 0 1
- 5 1
- 0
- 0
- 1
- 0
- 1
- 3 5
- 0 1 1 1 1
- 1 1 1 0 0
- 0 0 1 1 0
- 9 2
- 0 1
- 1 1
- 1 1
- 1 0
- 1 1
- 0 1
- 0 1
- 0 0
- 1 1
- 3
- 3 5
- 0 1 1 1 1
- 1 1 1 0 0
- 0 0 1 1 0
- 9 2
- 0 1
- 1 1
- 1 1
- 1 0
- 1 1
- 0 1
- 0 1
- 0 0
- 1 1
- 2 3
- 1 1 1
- 1 1 1
- Ieșire
- Datele de intrare corespund restricțiilor impuse
- qmatout.txt
- 2
Exemplul 2[edit | edit source]
- Intrare
- qmatin.txt
- 5
- 2 6
- 2 0 0 1 1 1
- 1 0 1 1 0 0
- 7 4
- 0 0 0 1
- 0 0 0 0
- 0 1 1 0
- 0 1 1 0
- 1 1 1 1
- 0 1 0 0
- 0 1 0 1
- 5 1
- 0
- 0
- 1
- 0
- 1
- 3 5
- 0 1 1 1 1
- 1 1 1 0 0
- 0 0 1 1 0
- 9 2
- 0 1
- 1 1
- 1 1
- 1 0
- 1 1
- 0 1
- 0 1
- 0 0
- 1 1
- 3
- 3 5
- 0 1 1 1 1
- 1 1 1 0 0
- 0 0 1 1 0
- 9 2
- 0 1
- 1 1
- 1 1
- 1 0
- 1 1
- 0 1
- 0 1
- 0 0
- 1 1
- 2 3
- 1 1 1
- 1 1 1
- Ieșire
- Datele de intrare NU corespund restricțiilor impuse
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line>
- 1629 - Qmat
def este_matrice_valida(matrice):
if len(matrice) == 0 or len(matrice[0]) == 0: return False
lungime_rand = len(matrice[0]) if any(len(rand) != lungime_rand for rand in matrice): return False
if any(element not in (0, 1) for rand in matrice for element in rand): return False
return True
def citeste_matrice(fisier):
nr_randuri, nr_coloane = map(int, fisier.readline().split()) matrice = [list(map(int, fisier.readline().split())) for _ in range(nr_randuri)] return matrice
def numara_aparitii(set_matrice_1, set_matrice_2):
numar_aparitii = 0 for matrice_2 in set_matrice_2: for matrice_1 in set_matrice_1: if matrice_1 == matrice_2: numar_aparitii += 1 break return numar_aparitii
def main():
with open("qmatin.txt", "r") as fisier: n = int(fisier.readline()) set_matrice_1 = [citeste_matrice(fisier) for _ in range(n)]
q = int(fisier.readline()) set_matrice_2 = [citeste_matrice(fisier) for _ in range(q)]
if all(este_matrice_valida(matrice) for set_matrice in [set_matrice_1, set_matrice_2] for matrice in set_matrice): print("Datele de intrare corespund restricțiilor impuse") rezultat = numara_aparitii(set_matrice_1, set_matrice_2) with open("qmatout.txt", "w") as fisier_out: fisier_out.write(str(rezultat)) else: print("Datele de intrare NU corespund restricțiilor impuse")
if __name__ == "__main__":
main()
</syntaxhighlight>