Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <vector>
- using namespace std;
- #define f(x,y) ((w) * (x) + (y))
- int parent1[2500],parent2[2500];
- int Find(int parent[], int x){
- if(parent[x] != x) parent[x] = Find(parent,parent[x]);
- return parent[x];
- }
- void Union(int parent[], int x, int y){
- x = Find(parent,x);
- y = Find(parent,y);
- parent[x] = y;
- }
- int main(){
- int tc = 1,w,h;
- char M[50][51];
- int dots[2500];
- while(true){
- scanf("%d %d",&w,&h);
- if(w == 0) break;
- int N = w * h;
- for(int i = 0;i < h;++i)
- scanf("%s",M[i]);
- for(int i = 0;i < N;++i)
- parent1[i] = parent2[i] = i;
- for(int i = 0;i < h;++i){
- for(int j = 0;j < w;++j){
- if(M[i][j] != '.'){
- if(i + 1 < h && M[i + 1][j] != '.') Union(parent1,f(i,j),f(i + 1,j));
- if(j + 1 < w && M[i][j + 1] != '.') Union(parent1,f(i,j),f(i,j + 1));
- }
- if(M[i][j] == 'X'){
- if(i + 1 < h && M[i + 1][j] == 'X') Union(parent2,f(i,j),f(i + 1,j));
- if(j + 1 < w && M[i][j + 1] == 'X') Union(parent2,f(i,j),f(i,j + 1));
- }
- }
- }
- memset(dots,0,sizeof dots);
- for(int i = 0,k = 0;i < h;++i)
- for(int j = 0;j < w;++j,++k)
- if(M[i][j] == 'X' && parent2[k] == k)
- ++dots[ Find(parent1,f(i,j)) ];
- printf("Throw %d\n",tc++);
- vector<int> ans;
- for(int i = 0;i < N;++i)
- if(dots[i] > 0)
- ans.push_back(dots[i]);
- sort(ans.begin(),ans.end());
- for(int i = 0;i < ans.size();++i){
- if(i > 0) putchar(' ');
- printf("%d",ans[i]);
- }
- putchar('\n');
- putchar('\n');
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement