1687 - Omogene

From Bitnami 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

<syntaxhighlight lang="python" line>

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

</syntaxhighlight>