Advertisement
Rusu

Fill Algorithm

Apr 9th, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.09 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. #define NMAX 500 // Schimbi in functie de dimensiunea maxima a lui N
  4.  
  5. using namespace std;
  6.  
  7. int matrice[NMAX][NMAX];
  8. int vizitat[NMAX][NMAX];
  9.  
  10. /// Vectori de directii
  11. int dx[] = {1, 0, -1, 0};
  12. int dy[] = {0, 1, 0, -1};
  13.  
  14. int N;
  15.  
  16. /// Algoritmul de umplere/fill
  17. void umplere(int linie, int coloana)
  18. {
  19.     // Daca nici nu ma aflu in matrice, ies
  20.     if(linie    < 0 || linie    >= N) return ;
  21.     if(coloana  < 0 || coloana  >= N) return ;
  22.  
  23.     // Daca am ajuns pe un zero, nu trebuie sa continuam sau sa marcam
  24.     if(matrice[linie][coloana] == 0)  return ;
  25.  
  26.     // Daca nu s-a oprit pana aici, inseamna ca:
  27.     // 1) Ne aflam in matrice
  28.     // 2) Ne aflam pe un 1
  29.     // Deci trebuie sa marcam
  30.     vizitat[linie][coloana] = 1;
  31.  
  32.     // Pentru fiecare directie
  33.     // directie = 0 -> Sud
  34.     // directie = 1 -> Est
  35.     // directie = 2 -> Nord
  36.     // directie = 3 -> Vest
  37.     for(int directie = 0; directie < 4; ++directie)
  38.     {
  39.         // Calculez noile coordonate
  40.         int linieNoua   = linie     + dx[directie];
  41.         int coloanaNoua = coloana   + dy[directie];
  42.  
  43.         // Ma duc pe acea pozitie si o verific daca n-a fost verificata deja
  44.         /// Daca ma duceam fara sa verific daca n-am mai fost, faceam o bucla infinita
  45.         if(vizitat[linieNoua][coloanaNoua] == 0)
  46.         {
  47.             umplere(linieNoua, coloanaNoua);
  48.         }
  49.     }
  50. }
  51.  
  52. int main() {
  53.     cin >> N;
  54.  
  55.     for(int i = 0; i < N; ++i)
  56.     {
  57.         for(int j = 0; j < N; ++j)
  58.         {
  59.             cin >> matrice[i][j];
  60.         }
  61.     }
  62.  
  63.     int nrComponente = 0;
  64.     for(int i = 0; i < N; ++i)
  65.     {
  66.         for(int j = 0; j < N; ++j)
  67.         {
  68.             if(matrice[i][j] == 1 && vizitat[i][j] == 0)
  69.             {
  70.                 // Inseamna ca am dat de o componenta noua
  71.                 // Daca vizitat ar fi fost 1, inseamna ca acest element (i, j) facea parte dintr-o alta componenta pe care am marcat-o
  72.  
  73.                 umplere(i, j);
  74.                 ++nrComponente;
  75.             }
  76.         }
  77.     }
  78.  
  79.     cout << nrComponente << '\n';
  80.  
  81.     return 0;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement