1629 - Qmat

From Bitnami MediaWiki
Revision as of 11:28, 18 December 2023 by Vasiliu Costel Andrei (talk | contribs) (Pagină nouă: == Enunț == 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 == 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 intra...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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>

  1. 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>