Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- ifstream fin("cusaturi.in");
- ofstream fout("cusaturi.out");
- int p, n, m, motive, nou, a[102][102], cate;
- int di[8] = {-1, -1, 0, 1, 1, 1, 0, -1};
- int dj[8] = {0, 1, 1, 1, 0, -1, -1, -1};
- queue<pair<int,int>>q;
- int ap[101];
- struct motiv
- {
- int indice;
- int sus, st, jos, dr;
- int l, L;
- };
- vector<motiv> v;
- vector<int>sol;
- void fil(int i, int j, int& nou)
- {
- int ni, nj, sus = i, jos = i, st = j, dr = j;
- q.push({i,j});
- a[i][j] = nou;
- while(!q.empty())
- {
- i = q.front().first;
- j = q.front().second;
- q.pop();
- for(int k = 0; k < 8; k++)
- {
- ni = di[k] + i;
- nj = dj[k] + j;
- if(a[ni][nj] == -1)
- {
- sus = min(sus, ni);
- jos = max(jos, ni);
- st = min(st, nj);
- dr = max(dr, nj);
- a[ni][nj] = nou;
- q.push({ni, nj});
- }
- }
- }
- v.push_back({nou, sus, st, jos, dr, dr-st, jos-sus});
- }
- bool verificare(motiv x, motiv y)
- {
- bool ok = true;
- for(int k1 = x.sus, k2 = y.sus; k1 <= x.jos && k2 <= y.jos; k1++, k2++)
- {
- for(int l1 = x.st, l2 = y.st; l1 <= x.dr && l2 <= y.dr; l1++, l2++)
- {
- if(a[k1][l1] != a[k2][l2] && (a[k1][l1] != x.indice || a[k2][l2] != y.indice))
- {
- ok = false;
- break;
- }
- }
- if(!ok)
- break;
- }
- if(!ok)
- {
- ok = true;
- for(int k1 = x.sus, k2 = y.jos; k1 <= x.jos && k2 >= y.sus; k1++, k2--)
- {
- for(int l1 = x.st, l2 = y.st; l1 <= x.dr && l2 <= y.dr; l1++, l2++)
- {
- if(a[k1][l1] != a[k2][l2] && (a[k1][l1] != x.indice || a[k2][l2] != y.indice))
- {
- ok = false;
- break;
- }
- }
- if(!ok)
- break;
- }
- }
- if(!ok)
- {
- ok = true;
- for(int k1 = x.sus, k2 = y.jos; k1 <= x.jos && k2 >= y.sus; k1++, k2--)
- {
- for(int l1 = x.st, l2 = y.dr; l1 <= x.dr && l2 >= y.st; l1++, l2--)
- {
- if(a[k1][l1] != a[k2][l2] && (a[k1][l1] != x.indice || a[k2][l2] != y.indice))
- {
- ok = false;
- break;
- }
- }
- if(!ok)
- break;
- }
- }
- if(!ok)
- {
- ok = true;
- for(int k1 = x.sus, k2 = y.sus; k1 <= x.jos && k2 <= y.jos; k1++, k2++)
- {
- for(int l1 = x.st, l2 = y.dr; l1 <= x.dr && l2 >= y.st; l1++, l2--)
- {
- if(a[k1][l1] != a[k2][l2] && (a[k1][l1] != x.indice || a[k2][l2] != y.indice))
- {
- ok = false;
- break;
- }
- }
- if(!ok)
- break;
- }
- }
- if(ok)
- return true;
- return false;
- }
- int main()
- {
- fin >> p >> n >> m;
- for(int i = 1; i <= n; i++)
- {
- for(int j = 1; j <= m; j++)
- {
- char c;
- fin >> c;
- if(c == 'X')
- {
- a[i][j] = -1;
- }
- }
- }
- for(int i = 1; i <= n; i++)
- {
- for(int j = 1; j <= m; j++)
- {
- if(a[i][j] == -1)
- {
- nou++;
- fil(i, j, nou);
- motive++;
- }
- }
- }
- if(p == 1)
- {
- fout << motive;
- }
- else
- {
- nou = 0;
- for(unsigned i = 0; i < v.size(); i++)
- {
- cate = 0;
- if(ap[i] == 0)
- {
- nou++;
- ap[i] = nou;
- cate++;
- for(unsigned j = i+1; j < v.size(); j++)
- {
- if(v[i].l == v[j].l && v[i].L == v[j].L)
- {
- if(verificare(v[i], v[j]))
- {
- ap[j] = nou;
- cate++;
- }
- }
- }
- }
- if(cate > 1)
- sol.push_back(cate);
- }
- for(int i = 0; i < v.size(); i++)
- {
- cout << "motivul: " << i << " sus, st, jos, dr, l, L: "
- << v[i].sus << ' ' << v[i].st << ' ' << v[i].jos << ' ' << v[i].dr << ' '
- << '\n';
- }
- sort(sol.begin(), sol.end());
- for(unsigned i = 0; i < sol.size(); i++)
- {
- fout << sol[i] << ' ';
- }
- }
- fin.close();
- fout.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement