Advertisement
Nita_Cristian

Cusaturi

Jan 21st, 2020
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.80 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin("cusaturi.in");
  6. ofstream fout("cusaturi.out");
  7.  
  8. int p, n, m, motive, nou, a[102][102], cate;
  9. int di[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
  10. int dj[8] = {0, 1, 1, 1, 0, -1, -1, -1};
  11. queue<pair<int,int>>q;
  12. int ap[101];
  13. struct motiv
  14. {
  15.     int indice;
  16.     int sus, st, jos, dr;
  17.     int l, L;
  18. };
  19. vector<motiv> v;
  20. vector<int>sol;
  21.  
  22. void fil(int i, int j, int& nou)
  23. {
  24.     int ni, nj, sus = i, jos = i, st = j, dr = j;
  25.     q.push({i,j});
  26.     a[i][j] = nou;
  27.  
  28.     while(!q.empty())
  29.     {
  30.         i = q.front().first;
  31.         j = q.front().second;
  32.         q.pop();
  33.  
  34.         for(int k = 0; k < 8; k++)
  35.         {
  36.             ni = di[k] + i;
  37.             nj = dj[k] + j;
  38.  
  39.             if(a[ni][nj] == -1)
  40.             {
  41.                 sus = min(sus, ni);
  42.                 jos = max(jos, ni);
  43.                 st = min(st, nj);
  44.                 dr = max(dr, nj);
  45.                 a[ni][nj] = nou;
  46.                 q.push({ni, nj});
  47.             }
  48.         }
  49.     }
  50.  
  51.     v.push_back({nou, sus, st, jos, dr, dr-st, jos-sus});
  52. }
  53.  
  54. bool verificare(motiv x, motiv y)
  55. {
  56.     bool ok = true;
  57.  
  58.     for(int k1 = x.sus, k2 = y.sus; k1 <= x.jos && k2 <= y.jos; k1++, k2++)
  59.     {
  60.         for(int l1 = x.st, l2 = y.st; l1 <= x.dr && l2 <= y.dr; l1++, l2++)
  61.         {
  62.             if(a[k1][l1] != a[k2][l2] && (a[k1][l1] != x.indice || a[k2][l2] != y.indice))
  63.             {
  64.                 ok = false;
  65.                 break;
  66.             }
  67.  
  68.         }
  69.         if(!ok)
  70.             break;
  71.     }
  72.  
  73.     if(!ok)
  74.     {
  75.         ok = true;
  76.         for(int k1 = x.sus, k2 = y.jos; k1 <= x.jos && k2 >= y.sus; k1++, k2--)
  77.         {
  78.             for(int l1 = x.st, l2 = y.st; l1 <= x.dr && l2 <= y.dr; l1++, l2++)
  79.             {
  80.                 if(a[k1][l1] != a[k2][l2] && (a[k1][l1] != x.indice || a[k2][l2] != y.indice))
  81.                 {
  82.                     ok = false;
  83.                     break;
  84.                 }
  85.             }
  86.             if(!ok)
  87.                 break;
  88.         }
  89.     }
  90.  
  91.     if(!ok)
  92.     {
  93.         ok = true;
  94.         for(int k1 = x.sus, k2 = y.jos; k1 <= x.jos && k2 >= y.sus; k1++, k2--)
  95.         {
  96.             for(int l1 = x.st, l2 = y.dr; l1 <= x.dr && l2 >= y.st; l1++, l2--)
  97.             {
  98.                 if(a[k1][l1] != a[k2][l2] && (a[k1][l1] != x.indice || a[k2][l2] != y.indice))
  99.                 {
  100.                     ok = false;
  101.                     break;
  102.                 }
  103.             }
  104.             if(!ok)
  105.                 break;
  106.         }
  107.     }
  108.  
  109.     if(!ok)
  110.     {
  111.         ok = true;
  112.         for(int k1 = x.sus, k2 = y.sus; k1 <= x.jos && k2 <= y.jos; k1++, k2++)
  113.         {
  114.             for(int l1 = x.st, l2 = y.dr; l1 <= x.dr && l2 >= y.st; l1++, l2--)
  115.             {
  116.                 if(a[k1][l1] != a[k2][l2] && (a[k1][l1] != x.indice || a[k2][l2] != y.indice))
  117.                 {
  118.                     ok = false;
  119.                     break;
  120.                 }
  121.             }
  122.             if(!ok)
  123.                 break;
  124.         }
  125.     }
  126.  
  127.     if(ok)
  128.         return true;
  129.     return false;
  130. }
  131.  
  132. int main()
  133. {
  134.     fin >> p >> n >> m;
  135.     for(int i = 1; i <= n; i++)
  136.     {
  137.         for(int j = 1; j <= m; j++)
  138.         {
  139.             char c;
  140.             fin >> c;
  141.             if(c == 'X')
  142.             {
  143.                 a[i][j] = -1;
  144.             }
  145.         }
  146.     }
  147.  
  148.     for(int i = 1; i <= n; i++)
  149.     {
  150.         for(int j = 1; j <= m; j++)
  151.         {
  152.             if(a[i][j] == -1)
  153.             {
  154.                 nou++;
  155.                 fil(i, j, nou);
  156.                 motive++;
  157.             }
  158.         }
  159.     }
  160.     if(p == 1)
  161.     {
  162.         fout << motive;
  163.     }
  164.     else
  165.     {
  166.         nou = 0;
  167.         for(unsigned i = 0; i < v.size(); i++)
  168.         {
  169.             cate = 0;
  170.             if(ap[i] == 0)
  171.             {
  172.                 nou++;
  173.                 ap[i] = nou;
  174.                 cate++;
  175.  
  176.                 for(unsigned j = i+1; j < v.size(); j++)
  177.                 {
  178.                     if(v[i].l == v[j].l && v[i].L == v[j].L)
  179.                     {
  180.                         if(verificare(v[i], v[j]))
  181.                         {
  182.                             ap[j] = nou;
  183.                             cate++;
  184.                         }
  185.  
  186.                     }
  187.                 }
  188.             }
  189.             if(cate > 1)
  190.                 sol.push_back(cate);
  191.         }
  192.  
  193.  
  194.         for(int i = 0; i < v.size(); i++)
  195.         {
  196.             cout << "motivul: " << i << " sus, st, jos, dr, l, L: "
  197.                  << v[i].sus << ' ' << v[i].st << ' ' << v[i].jos << ' ' << v[i].dr << ' '
  198.                  << '\n';
  199.         }
  200.  
  201.         sort(sol.begin(), sol.end());
  202.  
  203.         for(unsigned i = 0; i < sol.size(); i++)
  204.         {
  205.             fout << sol[i] << ' ';
  206.         }
  207.  
  208.     }
  209.     fin.close();
  210.     fout.close();
  211.     return 0;
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement