Advertisement
tonibiro

ASD lab5 prob6

Nov 6th, 2018
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. using namespace std;
  5.  
  6. struct nod
  7. {
  8.     int x, y;
  9.     nod *urm;
  10. };
  11.  
  12. struct coada
  13. {
  14.     nod *cap, *spate;
  15. };
  16.  
  17. void init_coada(coada &c)
  18. {
  19.     c.cap = NULL;
  20.     c.spate = NULL;
  21. }
  22.  
  23. void add_coada(coada &c, int i, int j)
  24. {
  25.     nod *p = new nod;
  26.     p->x = i;
  27.     p->y = j;
  28.     p->urm = NULL;
  29.     if(c.cap == NULL)
  30.         c.cap = c.spate = p;
  31.     else
  32.     {
  33.         c.spate->urm = p;
  34.         c.spate = p;
  35.     }
  36. }
  37.  
  38. void pop(coada &c, int &x, int &y)
  39. {
  40.     if(c.cap->urm == NULL)
  41.         c.cap = NULL;
  42.     else
  43.     {
  44.         nod *p = c.cap;
  45.         x = c.cap->x;
  46.         y = c.cap->y;
  47.         c.cap = c.cap->urm;
  48.         delete p;
  49.     }
  50. }
  51.  
  52. void citire_matrice(int &m, int a[][50])
  53. {
  54.     ifstream in("intrare.in");
  55.  
  56.     in >> m;
  57.     for(int i = 1; i <= m; ++i)
  58.         for(int j = 1; j <= m; ++j)
  59.             in >> a[i][j];
  60.     in.close();
  61. }
  62.  
  63. void adiacenti(int m, int a[][50], coada &c, int i, int j, int eti)
  64. {
  65.     int x, y;
  66.     a[i][j] = eti;
  67.     add_coada(c, i, j);
  68.     while(c.cap != NULL)
  69.     {
  70.         i = c.cap->x;
  71.         j = c.cap->y;
  72.  
  73.         if(a[i-1][j] == 1)
  74.         {
  75.             a[i-1][j] = eti;
  76.             add_coada(c, i-1, j);
  77.         }
  78.         if(a[i+1][j] == 1)
  79.         {
  80.             a[i+1][j] = eti;
  81.             add_coada(c, i+1, j);
  82.         }
  83.         if(a[i][j-1] == 1)
  84.         {
  85.             a[i][j-1] = eti;
  86.             add_coada(c, i, j-1);
  87.         }
  88.         if(a[i][j+1] == 1)
  89.         {
  90.             a[i][j+1] = eti;
  91.             add_coada(c, i, j+1);
  92.         }
  93.         pop(c, x, y);
  94.     }
  95. }
  96.  
  97. void bordare(int m, int a[][50])
  98. {
  99.     for(int j = 1; j <= m; ++j)
  100.         a[0][j] = a[m+1][j] = -1;
  101.     for(int i = 1; i <= m; ++i)
  102.         a[i][0] = a[i][m+1] = -1;
  103. }
  104.  
  105. void etichetare(int m, int a[][50], coada c)
  106. {
  107.     int eti = 2;
  108.     for(int i = 1; i <= m; ++i)
  109.     {
  110.         for(int j = 1; j <= m; ++j)
  111.         {
  112.             if(a[i][j] == 1)
  113.             {
  114.                 adiacenti(m, a, c, i, j, eti);
  115.                 ++eti;
  116.             }
  117.         }
  118.     }
  119. }
  120.  
  121. void afis_matrice(int m, int a[][50])
  122. {
  123.     for(int i = 1; i <= m; ++i)
  124.     {
  125.         for(int j = 1; j <= m ;++j)
  126.             cout << a[i][j] << ' ';
  127.         cout << "\n";
  128.     }
  129.     cout << "\n";
  130. }
  131.  
  132. int main()
  133. {
  134.     int m, a[50][50];
  135.     coada c;
  136.     init_coada(c);
  137.     citire_matrice(m, a);
  138.     bordare(m, a);
  139.     afis_matrice(m, a);
  140.     etichetare(m, a, c);
  141.     afis_matrice(m, a);
  142.     return 0;
  143. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement