1629 - Qmat

De la Universitas MediaWiki

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 intrare

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

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

  • 1 ⩽ n, q ⩽ 10.000
  • pentru orice matrice dată 1 ≤ nr. de linii, nr. de coloane ≤ 10

Exemplul 1

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

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

#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()