# PBinfo #4323 – MosCraciun_6 – Rezolvare C++

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

## Enunț

Cerința
Moș Crăciun locuiește la polul nord și pregătește cadouri pentru copiii cuminți din clasa a X-a B, ajutat de mai mulți spiriduși. Datorită încălzirii globale, gheața se topește, formându-se mai multe banchize. Spiridușii care se află pe alte banchize decât Moș Crăciun nu-l mai pot ajuta pe acesta. Pentru a putea să împacheteze cadourile, Moș Crăciun are nevoie de cel puțin k spiriduși. Ajutați-l pe Moș Crăciun să determine pe câte banchize se află cel puțin k spiriduși.

Harta polului nord seamănă cu o matrice cu n linii și m coloane în care elementele pot avea următoarele valori:


0 – zonă cu apă, în care gheața s-a topit.
1 – zonă cu gheață care face parte dintr-o banchiză. Două zone cu gheață fac parte din aceeași banchiză dacă se învecinează pe linie sau pe coloană.
2 – zonă cu gheață în care se găsește un spiriduș.

Scrieți un program care să determine pe câte banchize se află cel puțin k spiriduși.

Date de intrare
Fișierul de intrare moscraciun_6.in conține pe prima linie numerele n m k. Următoarele n linii conțin câte m elemente, 0, 1, sau 2, cu semnificația din enunț.

Date de ieșire
Fișierul de ieșire moscraciun_6.out va conține pe prima linie numărul C reprezentând numărul de banchize pe care se află cel puțin k spiriduși.

Restricții și precizări

1 ≤ n , m ≤ 100

Exemplu:
moscraciun_6.in

4 6 3
1 1 2 0 2 1
0 0 1 0 2 2
2 2 1 0 0 0
0 1 0 1 2 1
moscraciun_6.out

2
Explicație
Există două banchize pe care se află cel puțin 3 spiriduși.

## Cod sursă C++

```cpp
#include <fstream>
using namespace std;
ifstream fin("moscraciun_6.in");
ofstream fout("moscraciun_6.out");
int A[102][102],n,m,ck,k;
void fill(int i, int j, int &c)
{
    if(A[i][j]==2) c++;
    A[i][j]=0;
    if(A[i-1][j]>0 && i>=1) fill(i-1,j,c);
    if(A[i+1][j]>0 && i<=n) fill(i+1,j,c);
    if(A[i][j+1]>0 && j<=m) fill(i,j+1,c);
    if(A[i][j-1]>0 && j>=1) fill(i,j-1,c);
}
int main()
{
    fin>>n>>m>>k;
    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)
            {
                int c=0;
                fill(i,j,c);
                if(c>=k) ck++;
            }
    fout<<ck;
    return 0;
}
```

## Resurse

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