Sunteți pe pagina 1din 4

ALGORITMUL DE HASURARE A UNEI SUPRAFETE NCHISE FILL Se d o matrice binar (elementele egale cu 0 sau 1).

. Valorile 1 delimiteaz anumite suprafee nchise n cadrul matricei (elementele din interiorul acestor suprafee sunt marcate cu 0). Fiind date coordonatele x i i y ale unui element al matricei, semnificnd un punct n interiorul uneia dintre suprafee, se cere s se haureze suprafaa care conine acest element.

S1 P1*

S2

Avnd suprafeele S1 i S2, n interiorul suprafeei S1 se gsete punctul P1, se va haura suprafaa S1

De exemplu, dac avem matricea: A=[

] i considerm n interiorul su

punctul de coordonate (2,3), atunci dup executarea algoritmului FILL matricea va arta astfel: A=[ ].

Pentru rezolvarea problemei, se folosete functia recursiva fill, care funcioneaz astfel: testeaz dac elementul matricii ale crui coordonate i-au fost transmise are valoarea 0; dac acest lucru este adevrat, atunci elementul respectiv va primi valoarea 1, iar funcia se va autoapela pe rnd pentru fiecare din vecinii acestui element (ortogonal = stnga, dreapta, sus, jos); dac elementul este deja 1, atunci se revine din funcie.

Pentru a nu mai testa la fiecare pas dac s-a ajuns la marginea matricei, este suficient s se bordeze matricea cu cte un rnd de elemente egale cu 1. #include<fstream> #include<iostream> using namespace std; int a[20][20]; int m,n,x,y; void fill(int x, int y) { if(a[x][y]==0) { a[x][y]=1; fill(x+1,y); fill(x,y+1); fill(x-1,y);

fill(x,y-1); } } int main() { fstream f,g; f.open("fill.in",ios::in); g.open("fill.out",ios::out); f>>m>>n>>x>>y; int i,j; for(i=1;i<=m;i++) for(j=1;j<=n;j++) f>>a[i][j]; //bordare matrice for(i=1;i<=n;i++) a[0][i]=a[m+1][i]=1; for(i=1;i<=m;i++) a[i][0]=a[i][n+1]=1; g<<"Matricea initiala: "<<endl; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) g<<a[i][j]<<' '; g<<endl; } fill(x,y); g<<"Matricea finala: "<<endl; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) g<<a[i][j]<<' '; g<<endl; } f.close(); g.close(); }

PROBLEMA FOTOGRAFIEI Se d o fotografie alb-negru, sub forma unei matrice bniare. Aceasta nfieaz unul sau mai multe obiecte. Elementele din matrice care aparin unui obiect au valoarea 1. S se determine cte obiecte conine matricea i s se coloreze fiecare obiect cu o culoare diferit (elementele fiecrui obiect vor cpta toate aceeai valoare, i nu exist dou obiecte care s fie colorate la fel).

De exemplu, n matricea alturat avem un obierct, iar n urmtoarea trei obiecte.

A1= (

A2= ( )

Pentru colorarea efectiv a unui obiect se folosete funcia obiect, care funcioneaz aproape la fel cu funcia fill. Prima deosebire dintre cele dou este c n acest caz funcia va cuta pe toate cele 8 direcii posibile, deoarece i marginile unui obiect fac parte din acesta, iar cea de-a doua este c haura nu se face tot n cadrul matricei iniiale, ci n cadrul unei matrice b, auxiliare. Astfel, n momentul ntlnirii unui punct care aparine obiectului curent, funcia l va etrge pe acesta din matricea iniial i l va aduga colorat, n matricea auxiliar b. n plus, aceast funcie primete ca argument i numrul cu care trebuie s umple un anumit obiect. Pentru a evita testul de depire a marginilor matricei, aceasta se va borda cu elemente egale cu 0 (care nu aparin niciunui obiect). #include<fstream> #include<iostream> using namespace std; int a[20][20], b[20][20]; int m,n,nr; void obiect(int x, int y, int nr) { if(a[x][y]==1) { a[x][y]=0; b[x][y]=nr; obiect(x,y+1,nr); obiect(x+1,y+1,nr); obiect(x+1,y,nr); obiect(x+1,y-1,nr); obiect(x,y-1,nr); obiect(x-1,y-1,nr); obiect(x-1,y,nr); obiect(x-1,y+1,nr); } } int main() { fstream f,g; f.open("obiect.in",ios::in);

g.open("obiect.out",ios::out); f>>m>>n; int i,j; for(i=1;i<=m;i++) for(j=1;j<=n;j++) f>>a[i][j]; //bordare matrice for(i=0;i<=n+1;i++) a[0][i]=a[m+1][i]=0; for(i=0;i<=m+1;i++) a[i][0]=a[i][n+1]=0; g<<"Matricea initiala: "<<endl; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) g<<a[i][j]<<' '; g<<endl; } for(i=1;i<=m;i++) for(j=1;j<=n;j++) if(a[i][j]==1) { nr++; obiect(i,j,nr); } g<<"Matricea finala: "<<endl; for(i=1;i<=m;i++) { for(j=1;j<=n;j++) g<<b[i][j]<<' '; g<<endl; } f.close(); g.close(); }

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