2278 - MMultiplication

De la Universitas MediaWiki

Cerinta

Se dau două matrice cu elemente numere întregi. Determinați produsul lor, dacă este posibil.

Date de intrare

Fișierul de intrare mmultiplicationin.txt conține pe prima linie numerele n și m reprezentând numărul de linii, respectiv de coloane, al matricii A. Pe următoarele n linii sunt câte m numere întregi separate printr-un spațiu, reprezentând elementele matricii A. Pe linia n+2 a fișierului se află două numere p și q reprezentând numărul de linii, respectiv de coloane, al matricii B. Pe următoarele p linii sunt câte q numere întregi separate printr-un spațiu, reprezentând elementele matricii B.

Date de iesire

Fișierul de ieșire mmultiplicationout.txt va conține pe prima linie numărul -1, în cazul în care matricele nu pot fi înmulțite. Dacă matricele pot fi înmulțite, se va afișa matricea rezultată după înmulțirea celor două, câte o linie a matricei pe o linie din fișier, elementele fiecărei linii fiind separate prin câte un spațiu.

Restrictii si precizari

  • 1 &;les; n, m, p, q ⩽ 1000
  • elementele matricelor vor fi numere întregi cu valoarea absolută mai mică decât 2000

Exemplul 1

Intrare
mmultiplicationin.txt
4 3
1 2 3
4 5 6
7 8 9
10 11 12
3 5
1 2 3 4 5
6 7 8 9 10
11 12 13 14 0
Iesire
Datele introduse corespund restrictiilor impuse
mmultiplicationout.txt
46 52 58 64 25
100 115 130 145 70
154 178 202 226 115
208 241 274 307 160

Exemplul 2

Intrare
mmultiplicationin.txt
2 3
3600 0 -10
54 2479 1
3 2
0 0
1 1
0 1
Iesire
Datele introduse nu corespund restrictiilor impuse


Rezolvare

def citeste_matrice(fisier):
    # Citeste dimensiunile matricei
    n, m = map(int, fisier.readline().split())
    matrice = []

    # Citeste elementele matricei
    for _ in range(n):
        linie = list(map(int, fisier.readline().split()))
        matrice.append(linie)

    return matrice, n, m


def este_input_valid(n_A, m_A, n_B, m_B):
    return 1 <= n_A <= 1000 and 1 <= m_A <= 1000 and 1 <= n_B <= 1000 and 1 <= m_B <= 1000 and m_A == n_B


def inmulteste_matrici(matrice_A, n_A, m_A, matrice_B, n_B, m_B):
    if m_A != n_B:
        raise ValueError("Numărul de coloane al primei matrici nu coincide cu numărul de linii al celei de-a doua matrici")

    matrice_produs = [[0] * m_B for _ in range(n_A)]

    for i in range(n_A):
        for j in range(m_B):
            for k in range(m_A):
                matrice_produs[i][j] += matrice_A[i][k] * matrice_B[k][j]

    return matrice_produs, n_A, m_B


def scrie_matrice(fisier, matrice, n, m):
    fisier.write(f"{n} {m}\n")
    for linie in matrice:
        fisier.write(" ".join(map(str, linie)) + "\n")


def main():
    # Citirea datelor de intrare din fisier
    with open("mmultiplicationin.txt", "r") as f:
        n_A, m_A = map(int, f.readline().split())
        matrice_A, _, _ = citeste_matrice(f)
        n_B, m_B = map(int, f.readline().split())
        matrice_B, _, _ = citeste_matrice(f)

    # Verificare validitate date de intrare
    if not este_input_valid(n_A, m_A, n_B, m_B):
        print("Datele introduse nu corespund restrictiilor impuse.")
        return

    # Calcularea produsului matricelor
    try:
        matrice_produs, n_produs, m_produs = inmulteste_matrici(matrice_A, n_A, m_A, matrice_B, n_B, m_B)

        # Scrierea rezultatului în fisierul de ieșire
        with open("mmultiplicationout.txt", "w") as g:
            scrie_matrice(g, matrice_produs, n_produs, m_produs)

    except ValueError as e:
        # Nu se poate efectua înmulțirea
        with open("mmultiplicationout.txt", "w") as g:
            g.write("-1")


if __name__ == "__main__":
    main()