Sunteți pe pagina 1din 2

Algoritmul Fill (Flood Fill)

Algoritmul fill "umple" toate golurile accesibile de la un punct dat. Golurile pot fi elemente zero intr-o matrice,
de exemplu, iar vecinii pot fi definiți ca elementele adiacente pe linie și coloană (acesta este cazul cel mai întîlnit). Alteori
vecinii pot fi definiți ca avînd un punct comun cu elementul curent, ceea ce include și elementele alăturate pe diagonală.
1. Fiind dată o matrice m x n, unde m,n aparţin lui N si exista y elemente notate cu 1 si z elemente notate cu 0 iar
y+z=m*n, aflaţi aria cea mai întinsă de elemente de 1.
Exemplu: Se va afişa: 4, adică regiunea care cuprinde elementele: (1,2),(1,3),(2,2),(2,3)
44
0100
1000
1011
1011

int a[100][100],n,m,size,mx; int main()


int interior(int x,int y) {ifstream f("fill.in");
{return (x>=1&&x<=n&&y>=1&&y<=m);} f>>m>>n;
void afis() for(int i=1;i<=n;i++)
{cout<<mx<<endl; for(int j=1;j<=m;j++)
for(int i=1;i<=n;i++) f>>a[i][j];
{for(int j=1;j<=m;j++) int k=1;
cout<<a[i][j]<<" "; for(int i=1;i<=n;i++)
cout<<endl; for(int j=1;j<=m;j++)
} if(a[i][j]==1)
} {k++; //fiecărei regiuni ii va corespunde un
void fill(int x,int y,int k) număr de ordine
{if(a[x][y]==1&&interior(x,y)) size=0; //nr elem dintr-o regiune este
iniţial 0
{a[x][y]=k; //fiecărui elem din regiune îi
corespunde nr zonei fill(i,j,k);
size++; if(mx<size) mx=size;//calc max ariilor
/*verif dc elem alăturate pot aparţine aceeaşi }
regiuni şi dacă nu au fost încă marcate*/ afis();
fill(x-1,y,k); return 0;
fill(x+1,y,k); }
fill(x,y-1,k);
fill(x,y+1,k);}}

2. O matrice cu n linii şi coloane este reprezentarea negativului unei fotografii.


a) scrieţi un program care diferenţiază obiectele (afis() matrice)
b) care este cea mai mare suprafaţă a unui obiect (cout<<mx //?k+1)
c) care este suprafaţa liberă (void->int)

44
0 2 12
1 0

0 21 2
1 0

3 0 0
1 0

4 4
0 0 1 1
3. Se dă harta unui lac de formă dreptunghiulară, împărțit în n*m zone dispuse sub forma unei matrice cu n linii
și m coloane. Zonele pot fi acoperite cu apă, sau pot fi zone de uscat. Zonele de uscat care sunt învecinate pe linie sau pe
coloană formează insule sau peninsule. Peninsule conțin cel puțin o zonă de uscat pe marginea lacului (matricei), în timp
ce insulele sunt situate în întregime în interiorul lacului.
Cunoscând harta lacului, determinați numărul de insule și numărul de peninsule.
69
110011100
001010100
110000000
100011100
111101000
100000110
int a[100][100],n,m,nri,nrp; int main()
int interior(int x,int y) {ifstream f("lac.in");
{ f>>n>>m;
return (x>=1&&x<=n&&y>=1&&y<=m); for(int i=1;i<=n;i++)
} for(int j=1;j<=m;j++)
void afis() f>>a[i][j];
{cout<<”insule ”<<nri<<" penins int k=1;
"<<nrp<<endl; for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
{for(int j=1;j<=m;j++)
cout<<a[i][j]<<" "; if(a[i][j]==1&&(i==1||i==n||j==1||j==m))
cout<<endl; {nrp++;
} k++;
} fill(i,j,k);
void fill(int x,int y,int k) }
{ else if(a[i][j]==1)
if(a[x][y]==1&&interior(x,y)) {nri++;
{a[x][y]=k; k++;
fill(x-1,y,k); fill(i,j,k);
fill(x+1,y,k); }
fill(x,y-1,k); afis();
fill(x,y+1,k); return 0;
} }
}

4. Arhipelagul RGB este format din insule care aparţin ţărilor R, G şi B. Putem reprezenta harta arhipelagului ca o matrice
cu N linii şi M coloane cu elemente din mulţimea {0, 1, 2, 3} astfel:
 un element egal cu 0 reprezintă o zonă acoperită de apă
 un element egal cu 1 reprezintă o zonă de pământ aparţinând unei insule din ţara R
 un element egal cu 2 reprezintă o zonă de pământ aparţinând unei insule din ţara G
 un element egal cu 3 reprezintă o zonă de pământ aparţinând unei insule din ţara B
Dată fiind harta arhipelagului să se determine câte insule aparţin fiecărei ţări.
67 R are 4 insule, void fill(int x,int y,int k,int z)
{if(a[x][y]==z&&interior(x,y))
1000320 G are 2 insule {a[x][y]=k;
0110313 B are 3 insule fill(x-1,y,k,z);
3333000 fill(x+1,y,k,z);
fill(x,y-1,k,z);
2033000 fill(x,y+1,k,z);
2203011 }
2000010 }
int main()
int a[100][100],n,m,R,G,B; {ifstream f("insule.in");
int interior(int x,int y) f>>n>>m;
{ for(int i=1;i<=n;i++)
return (x>=1&&x<=n&&y>=1&&y<=m); for(int j=1;j<=m;j++)
} f>>a[i][j];
void afis() int z,k1=-1,k2=-2,k3=-3;
{cout<<"R:"<<R<<"G:"<<G<<"B:"<<B<<endl; for(int i=1;i<=n;i++)
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
{for(int j=1;j<=m;j++) if(a[i][j]==1){R++;z=1;fill(i,j,k1,z);}
cout<<a[i][j]<<" "; else
cout<<endl; if(a[i][j]==2){G++;z=2;fill(i,j,k2,z);}
} else if(a[i][j]==3){B++;z=3;
} fill(i,j,k3,z);}
afis();}

S-ar putea să vă placă și