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
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema LSQ:
#include <bits/stdc++.h>
#define Nmax 1005
using namespace std;
ifstream fin("lsq.in");
ofstream fout("lsq.out");
int N, M;
char C[Nmax];
int A[Nmax][Nmax];
int LRU[Nmax][Nmax], CRU[Nmax][Nmax], LDL[Nmax][Nmax], CDL[Nmax][Nmax];
set <int> S;
vector <int> E[Nmax];
int ans;
int main()
{
fin >> N >> M;
for(int i = 1; i <= N; i++)
{
fin >> (C + 1);
for(int j = 1; j <= M; j++)
A[i][j] = C[j] - '0';
}
for(int i = 1; i <= N; i++)
for(int j = 1; j <= M; j++)
if(A[i][j] == 1)
LDL[i][j] = 1 + LDL[i][j - 1], CDL[i][j] = 1 + CDL[i - 1][j];
for(int i = N; i >= 1; i--)
for(int j = M; j >= 1; j--)
if(A[i][j] == 1)
LRU[i][j] = 1 + LRU[i][j + 1], CRU[i][j] = 1 + CRU[i + 1][j];
int ans = 0;
for(int i = N; i >= 1; i--)
for(int j = M; j >= 1; j--)
for(int L = min(LDL[i][j], CDL[i][j]); L > ans; L--)
if(L <= min(LRU[i - L + 1][j - L + 1], CRU[i - L + 1][j - L + 1]))
ans = L;
fout << ans << "\n";
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #2724 LSQ
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2724 LSQ de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!