fbpx

Problema #1576 – zona3 – Rezolvari PBInfo

de Mihai-Alexandru

Cerința

Se consideră o matrice cu n linii și m coloane. Spunem că o poziție este liberă dacă elementul de pe linia i și coloana j este egal cu 0 și 1 în caz contrar. Spunem despre mai multe elemente ocupate că formează o zonă, dacă elementele se învecinează pe cele patru direcții (sus, jos, dreapta, stânga).

Calculați pentru fiecare zonă numărul de elemente și afișați noua matrice formată prin înlocuirea elementelor egale cu 1 cu numărul de elemente pe care îl are zona din care face parte elementul respectiv.

Date de intrare

De pe prima linie a fișierului zona3.in se citesc două numere naturale n și m. Următoarele n linii conțin câte m valori 0 sau 1.

Date de ieșire

Scrieți în fișierul zona3.out matricea care rezultă din operațiile specificate în cerință.

Restricții și precizări

  • 2 ≤ n, m ≤ 100

Exemplu

zona3.in

6 8
1 1 0 0 1 1 1 0
0 0 0 1 1 1 0 0
1 1 0 0 0 1 0 0
0 1 1 1 1 0 0 0
0 0 0 0 1 1 0 0
1 1 0 1 0 0 0 1

zona3.out

2 2 0 0 7 7 7 0
0 0 0 7 7 7 0 0
8 8 0 0 0 7 0 0
0 8 8 8 8 0 0 0
0 0 0 0 8 8 0 0
2 2 0 1 0 0 0 1

Explicație

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

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

int a[105][105] , b[105][105] , v[10005] , p = 1;

void fill(int i , int j , int &c)
{
    if(a[i][j]==1)
    {
        a[i][j]=0;
        c++;
        if(a[i+1][j]==1)
            fill(i+1 , j , c);
        if(a[i-1][j]==1)
            fill(i-1 , j , c);
        if(a[i][j+1]==1)
            fill(i , j+1 , c);
        if(a[i][j-1]==1)
            fill(i , j-1 , c);
    }
}

void fill1(int i , int j , int val)
{
    if(b[i][j]==1)
    {
        b[i][j]=val;
        if(b[i+1][j]==1)
            fill1(i+1 , j , val);
        if(b[i-1][j]==1)
            fill1(i-1 , j , val);
        if(b[i][j+1]==1)
            fill1(i , j+1 , val);
        if(b[i][j-1]==1)
            fill1(i , j-1 , val);
    }
}

int main()
{
    int n , m;
    cin >> n >> m;
    for(int i = 1 ; i <= n ; ++i)
        for(int j = 1 ; j <= m ; ++j)
            cin >> a[i][j] , b[i][j] = a[i][j];
    for(int i = 1 ; i <= n ; ++i)
        for(int j = 1 ; j <= m ; ++j)
            if(a[i][j]==1)
            {
                int c = 0;
                fill(i , j , c);
                v[p]=c;
                p++;
            }
    p--;
    int cnt=1;
    for(int i = 1 ; i <= n ; ++i)
        for(int j = 1 ; j <= m ; ++j)
            if(b[i][j]==1)
            {
                fill1(i , j , v[cnt]);
                cnt++;
            }
    for(int i = 1 ; i <= n ; ++i)
    {
        for(int j = 1 ; j <= m ; ++j)
            cout << b[i][j] << ' ';
        cout << endl;
    }
    return 0;
}
Comentarii

S-ar putea sa iti placa