1267 - plaja

From Bitnami MediaWiki
Revision as of 23:24, 10 December 2023 by Bonte Lucas Gabriel (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Cerința

O plajă poate fi văzută ca o matrice cu n linii și m coloane. Elementele matricii sunt codificate cu 0, însemnând o poziție liberă, și 1, însemnând o poziție ocupată. Să se afle aria celui mai mare dreptunghi liber din matricea dată.

Date de intrare

Fișierul de intrare plajain.txt conține pe prima linie numerele n și m, iar pe următoarele n linii câte m caractere reprezentând plaja.

Date de ieșire

Fișierul de ieșire plajaout.txt va conține pe prima linie numărul S, reprezentând aria maximă a unui dreptunghi liber.

Restricții și precizări

  • 1 ≤ n, m ≤ 1000

Exemplul 1:

plajain.txt

5 5
11111
11000
11100
11100
11110

plajaout.txt

Datele de intrare corespund restrictiilor impuse
6

Exemplul 2:

plajain.txt

plaja

plajaout.txt

Datele de intrare nu corespund restrictiilor impuse

Explicație

1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0

Suprafata dreptunghiulara de aria maxima este cea ingrosata.

Rezolvare

<syntaxhighlight lang="python" line="1" start="1">

def validare(matrice, n_linii, m_coloane): # functia de validare a datelor de intrare

   if not matrice:
       raise ValueError("Matricea este goala")
   if not (1 <= n_linii <= 1000) or not (1 <= m_coloane <= 1000):
       raise ValueError("Valorile n sau m nu respecta restrictiile impuse")
   for row in matrice:
       if len(row) != m_coloane:
           raise ValueError("Lungimea randului nu este egala cu m")
       for element in row:
           if not element.isdigit():    # fiecare caracter trebuie sa fie cifra
               raise ValueError("Elementul matricei nu este o cifra")
   file_out.write("Datele de intrare corespund restrictiilor impuse\n")


def max_rectangle(matrice): # functia de rezolvare

   m_coloane = len(matrice[0])
   height = [0] * (m_coloane + 1)
   ans = 0
   for row in matrice:
       for i in range(m_coloane):
           height[i] = height[i] + 1 if row[i] == '0' else 0
       stack = [-1]
       for i in range(m_coloane + 1):
           while height[i] < height[stack[-1]]:
               h = height[stack.pop()]
               w = i - 1 - stack[-1]
               ans = max(ans, h * w)
           stack.append(i)
   return ans


if __name__ == '__main__':

   file_in = open('plajain.txt', 'r')         # declararea fisierelor
   file_out = open('plajaout.txt', 'w')       # fisierul out trebuie declarat cu optiunea "w" (write)
   try:
       n, m = map(int, file_in.readline().split())
       matrix = [list(file_in.readline().strip()) for _ in range(n)]
       validare(matrix, n, m)                 # apelul functiei de validare
       area = max_rectangle(matrix)     # apelul functiei de rezolvare
       file_out.write(str(area))
   except ValueError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")
   except IndexError:
       file_out.write("Datele de intrare nu corespund restrictiilor impuse")

</syntaxhighlight>