fbpx

Problema #2724 – LSQ – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se dă o matrice binară (valori 0 și 1). Să se determine care este latura maximă a unui pătrat cu proprietatea că acesta are pe marginea sa doar valori 1.

Date de intrare

Fișierul de intrare lsq.in conține pe prima linie numerele N și M, reprezentând numărul de linii și numărul de coloane ale matricei, apoi N linii, pe fiecare câte M valori 0 sau 1, neseparate prin niciun spațiu, reprezentând elementele matricei..

Date de ieșire

Fișierul de ieșire lsq.out va conține pe prima linie numărul L, reprezentând lungimea maximă a laturii unui pătrat ce conține doar 1 pe marginea sa.

Restricții și precizări

  • 1 ≤ N, M ≤ 1000
  • Se consideră pătrat și cel de latură 1 (conține doar un element).

Exemplu

lsq.in

7 7
0000000
0111100
0101111
0100101
0111111
0000011
0000011

lsq.out

4

Explicație

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

#include <bits/stdc++.h>
using namespace std;

ifstream cin("lsq.in");
ofstream cout("lsq.out");

int nord[1002][1002] , vest[1002][1002] , n , m , lmax;
char a[1002][1002];

int main()
{
    cin >> n >> m;
    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= m ; j++)
        {
            cin >> a[i][j];
            if(a[i][j] == '1')
            {
                nord[i][j] = a[i][j] - '0' + nord[i-1][j];
                vest[i][j] = a[i][j] - '0' + vest[i][j-1];
            }
        }
    for(int i = 1 ; i <= n ; i++)
        for(int j = 1 ; j <= m ; j++)
            for(int k = max(lmax , 1) ; k <= m - j + 1 && k <= n - i + 1; k++)
            if(vest[i][j + k - 1] - vest[i][j] + 1 == k && vest[i + k - 1][j + k - 1] - vest[i + k - 1][j] + 1 == k && ///sus si jos
               nord[i + k - 1][j] - nord[i][j] + 1 == k && nord[i + k - 1][j + k - 1] - nord[i][j + k - 1] + 1 == k)///stanga si dreapta
                if(k > lmax) lmax = k;

    cout << lmax;
}
Comentarii

S-ar putea sa iti placa