330
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