1687 - Omogene

De la Universitas MediaWiki

Enunț

Se consideră o matrice cu L linii și C coloane care memorează doar valori din mulțimea {0,1,2}. O submatrice nevidă (formată din cel puțin o linie și cel puțin o coloană) a acestei matrice o numim omogenă dacă numărul valorilor de 0 este egal cu numărul de valori de 1 și egal cu numărul valorilor de 2. De exemplu, în matricea

0 1 2 0
1 2 0 1
sunt șase submatrice omogene, acestea fiind:

0 1 2
1 2 0

1 2 0
2 0 1

0 1 2

1 2 0

1 2 0

2 0 1

Submatricele a treia și a patra sunt formate din prima linie a matricei inițială, iar submatricele a cincea și a șasea sunt formate din a doua linie.

Cerința

Să se determine câte submatrice nevide omogene există.

Date de intrare

Fișierul de intrare omogenein.txt conține pe prima linie numerele naturale L și C. Pe următoarele L linii se află câte C numere naturale separate prin spații reprezentând câte o linie din matrice.

Date de ieșire

Fișierul de ieșire omogeneout.txt va conține pe prima linie un singur număr natural reprezentând numărul submatricelor nevide omogene.

Restricții și precizări

  • 2 ⩽ lc ⩽ 500
  • 4 ⩽ l*c ⩽ 65536
  • Atenție, o submatrice este formată dintr-o secvență continuă de linii și coloane, deci, de exemplu, dacă se aleg dintr-o matrice liniile 1, 2 și 5, atunci acestea nu formează o submatrice.
  • Numărul submatricelor omogene va fi mai mic decât 2*10^9
  • Întreaga matrice poate fi submatrice omogenă

Exemplul 1

Intrare
omogenein.txt
2 4
0 1 2 0
1 2 0 1
Ieșire
Datele de intrare corespund restricțiilor impuse
omogeneout.txt
6

Explicație

Cele șase submatrice au fost menționate în enunț.

Exemplul 2

Intrare
omogenein.txt
3 3
0 1 2
0 2 2
0 1 1
Ieșire
Datele de intrare corespund restricțiilor impuse
omogeneout.txt
3

Exemplul 3

Intrare
omogenein.txt
1 3
0 1 2
0 2 2
0 1 1
Ieșire
Datele de intrare NU corespund restricțiilor impuse

Rezolvare

#1687 - Omogene

def validare_date(l, c, matrice):
    if not (2 <= l <= c <= 5000):
        return False
    if not (4 <= l * c <= 65536):
        return False
    if len(matrice) != l or any(len(row) != c for row in matrice):
        return False
    return True


def numar_submatrici_omogene(l, c, matrice):
    if not validare_date(l, c, matrice):
        return 0

    numar_submatrici = 0

    for i in range(l):
        for j in range(c):
            for x in range(i, l):
                for y in range(j, c):
                    submatrice = [matrice[k][j:y + 1] for k in range(i, x + 1)]
                    numar_0 = sum(row.count(0) for row in submatrice)
                    numar_1 = sum(row.count(1) for row in submatrice)
                    numar_2 = sum(row.count(2) for row in submatrice)

                    if numar_0 == numar_1 == numar_2:
                        numar_submatrici += 1

    return numar_submatrici


with open("omogenein.txt", "r") as f:
    l, c = map(int, f.readline().split())
    matrice = [list(map(int, f.readline().split())) for _ in range(l)]

    if validare_date(l, c, matrice):
        print("Datele de intrare corespund restricțiilor impuse")

        rezultat = numar_submatrici_omogene(l, c, matrice)

        with open("omogeneout.txt", "w") as f:
            f.write(str(rezultat))

    else:
        print("Datele de intrare NU corespund restricțiilor impuse")
        exit(0)