1267 - plaja: Difference between revisions
Pagină nouă: ==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 '''plaja.in''' conține pe prima linie numerele '''n''' și '''m''', iar pe următoarele '''n''' linii câte '''m''' caractere reprezentând plaja. =... |
No edit summary |
||
Line 5: | Line 5: | ||
==Date de intrare== | ==Date de intrare== | ||
Fișierul 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== | ==Date de ieșire== | ||
Fișierul 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== | ==Restricții și precizări== | ||
Line 15: | Line 15: | ||
*'''1 ≤ n, m ≤ 1000''' | *'''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== | ==Explicație== | ||
Line 44: | Line 55: | ||
<syntaxhighlight lang="python" line="1" start="1"> | <syntaxhighlight lang="python" line="1" start="1"> | ||
def validare(matrice, n_linii, m_coloane): # functia de validare a datelor de intrare | |||
def | if not matrice: | ||
raise ValueError("Matricea este goala") | |||
if not | |||
m = len( | if not (1 <= n_linii <= 1000) or not (1 <= m_coloane <= 1000): | ||
raise ValueError("Valorile n sau m nu respecta restrictiile impuse") | |||
height = [0] * ( | |||
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 | ans = 0 | ||
for row in matrice: | |||
for row in | for i in range(m_coloane): | ||
for i in range( | |||
height[i] = height[i] + 1 if row[i] == '0' else 0 | height[i] = height[i] + 1 if row[i] == '0' else 0 | ||
stack = [-1] | stack = [-1] | ||
for i in range( | for i in range(m_coloane + 1): | ||
while height[i] < height[stack[-1]]: | while height[i] < height[stack[-1]]: | ||
h = height[stack.pop()] | h = height[stack.pop()] | ||
w = i - 1 - stack[-1] | w = i - 1 - stack[-1] | ||
ans = max(ans, h * w) | ans = max(ans, h * w) | ||
stack.append(i) | stack.append(i) | ||
return ans | return ans | ||
if __name__ == '__main__': | |||
if __name__ == " | 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> | </syntaxhighlight> |
Latest revision as of 23:24, 10 December 2023
Cerința[edit | edit source]
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[edit | edit source]
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[edit | edit source]
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[edit | edit source]
- 1 ≤ n, m ≤ 1000
Exemplul 1:[edit | edit source]
plajain.txt
5 5 11111 11000 11100 11100 11110
plajaout.txt
Datele de intrare corespund restrictiilor impuse 6
Exemplul 2:[edit | edit source]
plajain.txt
plaja
plajaout.txt
Datele de intrare nu corespund restrictiilor impuse
Explicație[edit | edit source]
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[edit | edit source]
<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>