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; }