Cred ca se face cu Divide et Impera. Seamana cu problema taieturilor.
Faci o functie care gaseste “zona” goala cea mai mare.
drept(Xa,Xb,Ya,Yb) -Xa,Xb coordonatele coltului stanga sus, Ya,Yb - coordonatele dreapta jos (sau poti sa le alegi cum vrei, dar asa e in problema); Xa -linia, Xb-coloana
a) Daca vreunul dintre colturi are valoarea 1, atunci gasesti un dreptunghi mai mic cat mai mare care nu contine acel colt.
Sa zicem ca coltul (Xa,Xb) e 1. Noile dreptunghiuri vor fi:
drept(Xa+1,Xb,Ya,Yb)
drept(Xa,Xb+1,Ya,Yb)
Pentru celelalte colturi e la fel.
Cand gasesti un dreptunghi care are toate colturile libere, cauti sa aiba latura mica cat mai mare (latura mica a dreptunghiului e defapt viitoarea latura a patratului) si memorezi coltul stanga-sus.
Afisezi latura maxima gasita si apoi coordonatele memorate care ii corespund.
b) Pentru fiecare valoare de 1 in interiorul (sau pe marginea) dreptunghiului (Xa,Xb,Ya,Yb) cu coordonatele (Va,Vb) verifici toate dreptunghiurile mai mici (4) in care este impartit dreptunghiul mare (care pana la urma nu vor contine valori de 1 inauntru)
drept(Xa,Xb,Ya,Vb-1) –dreptunghiul din stanga
drept(Xa,Vb+1,Ya,Yb) -dreptunghiul din dreapta
drept(Xa,Xb,Va-1,Yb) -dreptunghiul de sus
drept(Va+1,Xb ,Ya,Yb) -dreptunghiul de jos
Am adaugat si scazut 1 pentru ca noile dreptunghiuri sa nu contina acea valoare de 1.
Daca nu contine nicio valoare de 1, cauti ca si la a) un dreptunghi cu latura mica cat mai mare (pentru ca aria patratului sa fie cat mai mare).
Daca aria lui e mai mare decat aria maxima gasita, atunci aceasta devine noua arie maxima.
Iti sugerez sa desenezi toate astea sa intelegi mai bine.
Huh, mi-a luat ceva... Daca nu o rezolvi, ma supar!