# PBinfo #3220 – foto – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: andrei

## Enunț

Alina este pasionată de fotografiile alb-negru. Ea ales o imagine pe care a codificat-o binar într-o matrice de dimensiune n x m cu valori 0 corespunzătoare pentru alb (pe care le-a numit puncte luminoase) și cu valori 1 corespunzătoare pentru negru (pe care le-a numit puncte întunecate). Astfel, ea identifică în imaginea codificată zone luminoase și zone întunecate, o zonă fiind o porțiune a matricei care conține elemente cu aceeași valoare, trecerea de la un element la altul al zonei făcându-se doar prin deplasări pe orizontală sau pe verticală. 

Cerința
Ajutați-o pe Alina să găsească cea mai luminoasă zonă și determinați numărul de puncte luminoase ale acesteia.

Date de intrare
Pe prima linie a fișierului text foto.in se găsesc două numere naturale n și m care reprezintă numărul liniilor, respectiv numărul coloanelor matricei. Pe următoarele n linii se găsesc câte m valori binare, separate prin câte un spațiu, reprezentând elementele matricei care codifică imaginea.

Date de ieșire
Fișierul de ieșire foto.out trebuie să conțină o singură linie pe care se va afla numărul punctelor din cea mai luminoasă zonă a imaginii.

Restricții și precizări

1 ≤ n ≤ 100, 1 ≤ m ≤ 100, numere naturale
dacă nu există nicio zonă luminoasă, se va considera că cea mai luminoasă zonă are 0 elemente

Exemplu:
foto.in

6 6
1 0 0 1 1 1
1 1 0 1 0 1
1 0 0 1 0 0
1 1 1 0 1 1
1 0 0 1 1 0
1 0 0 1 1 1
foto.out

5
Explicație
Zona cea mai luminoasă este formată din elementele: (1,2), (1,3), (2,3), (3,2), (3,3).

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
ifstream fin("foto.in");
ofstream fout("foto.out");
const int dx[]={0,-1,0,1,0};
const int dy[]={0,0,1,0,-1};
short a[101][101],n,m;
int mx,nr;
int interior(int x, int y);
void umple(int x, int y, int& mark);
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        fin>>a[i][j];
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        if(a[i][j]==0)
        {
        nr=0;
        umple(i,j,nr);
        if(nr>mx)mx=nr;
        }
    fout<<mx<<'\n';
    return 0;
}
void umple(int x, int y, int &mark)
{
    int l,c,k;
    mark++;
    a[x][y]=-1*mark;
    for(k=1;k<=4;k++)
    {
        l=x+dx[k];
        c=y+dy[k];
        if(interior(l,c) && (a[l][c]==0))
           umple(l,c,mark);
    }
}
int interior(int x, int y)
{
    return x>0 && x<=n && y>0 && y<=m;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/3220)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/3220/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-3220/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
