1267 - plaja

De la Universitas MediaWiki

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

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")