Page 41 - MATINF Nr. 9-10
P. 41

Algoritmul fill s , i aplicat , ii                                                              41



                1. Citim m, n, elementele tabloului a s , i x0, y0 - linia s , i coloana pixelului interior conturului.

                2. Din (x0,y0) gener˘am toate traseele cu metoda backtracking ˆın plan, f˘ar˘a a le memora,
            doar marc˘am cu 1 elementele de pe aceste trasee. Cˆand ne g˘asim ˆıntr-un element a[i][j] putem s˘
                                                                                                            a
            ne deplas˘am numai ˆın cele 4 direct , ii: sus, dreapta, jos, stˆanga dac˘ elementele respective sunt 0.
                                                                               a
                 a
            Adic˘ ˆın a[i-1][j], a[i][j+1], a[i+1][j], a[i][j-1]. Pe scurt din a[i][j] ˆın a[in][jn], unde in = i + dl[k],
            jn = j + dc[k], k = 0, 1, 2, 3, vectorii dl s , i dc memorˆand deplas˘arile relative ˆın cele 4 direct , ii:
                int dl[4]={-1, 0, 1, 0};

                int dc[4]={ 0, 1, 0,-1};

                3. Dup˘ umplerea conturului ˆınchis se afis , eaz˘ tabloul.
                                                              a
                       a
                Programul C++ pentru algoritmul de umplere a unui contur ˆınchis este prezentat ˆın
            continuare.
            #include <fstream >
             using namespace std;

             ifstream fin("fill.in");
             ofstream fout("fill.out");

            int a[200][200] ,m,n,x0 ,y0;
            int dl[4]={ -1 , 0, 1, 0};
            int dc [4]={ 0, 1, 0,-1};

             void cit (){ // citirea imaginii si a coordonatelor unui pixel interior
            int i,j;
            fin >>m>>n;
            for(i=1;i<=m;i++)
                       for(j=1;j<=n;j++)
                                 fin >>a[i][j];
            fin >>x0 >>y0;
            }

             void fill(int i, int j){
            int k,n,in ,jn;
            a[i][j] = 1; // coloaram cu 1 pixelul curent din contur
            for(k=0;k<4; k++){ // verificam pixeli vecini celui curent
                       in = i + dl[k];
                       jn = j + dc[k];
                       if(in >=1 && in <=m && jn >=1 && jn <=n && a[in][jn] == 0)
                                 fill(in ,jn);
            }
            }

             void afis (){ // afisarea tabloului bidimensional
            int i,j;
            for(i=1;i<=m;i++){
                       for(j=1;j<=n;j++)
                                 fout <<a[i][j]<<" ";
                       fout <<endl;
            }
            }

            int main (){
            cit ();
             fill(x0 ,y0);
   36   37   38   39   40   41   42   43   44   45   46