Advertisement
MarioYC

Selectivo 3 - P1

Sep 10th, 2012
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.04 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. #define f(x,y) ((w) * (x) + (y))
  9.  
  10. int parent1[2500],parent2[2500];
  11.  
  12. int Find(int parent[], int x){
  13.     if(parent[x] != x) parent[x] = Find(parent,parent[x]);
  14.     return parent[x];
  15. }
  16.  
  17. void Union(int parent[], int x, int y){
  18.     x = Find(parent,x);
  19.     y = Find(parent,y);
  20.     parent[x] = y;
  21. }
  22.  
  23. int main(){
  24.     int tc = 1,w,h;
  25.     char M[50][51];
  26.     int dots[2500];
  27.    
  28.     while(true){
  29.         scanf("%d %d",&w,&h);
  30.         if(w == 0) break;
  31.        
  32.         int N = w * h;
  33.        
  34.         for(int i = 0;i < h;++i)
  35.             scanf("%s",M[i]);
  36.        
  37.         for(int i = 0;i < N;++i)
  38.             parent1[i] = parent2[i] = i;
  39.        
  40.         for(int i = 0;i < h;++i){
  41.             for(int j = 0;j < w;++j){
  42.                 if(M[i][j] != '.'){
  43.                     if(i + 1 < h && M[i + 1][j] != '.') Union(parent1,f(i,j),f(i + 1,j));
  44.                     if(j + 1 < w && M[i][j + 1] != '.') Union(parent1,f(i,j),f(i,j + 1));
  45.                 }
  46.                
  47.                 if(M[i][j] == 'X'){
  48.                     if(i + 1 < h && M[i + 1][j] == 'X') Union(parent2,f(i,j),f(i + 1,j));
  49.                     if(j + 1 < w && M[i][j + 1] == 'X') Union(parent2,f(i,j),f(i,j + 1));
  50.                 }
  51.             }
  52.         }
  53.        
  54.         memset(dots,0,sizeof dots);
  55.        
  56.         for(int i = 0,k = 0;i < h;++i)
  57.             for(int j = 0;j < w;++j,++k)
  58.                 if(M[i][j] == 'X' && parent2[k] == k)
  59.                     ++dots[ Find(parent1,f(i,j)) ];
  60.        
  61.         printf("Throw %d\n",tc++);
  62.        
  63.         vector<int> ans;
  64.        
  65.         for(int i = 0;i < N;++i)
  66.             if(dots[i] > 0)
  67.                 ans.push_back(dots[i]);
  68.        
  69.         sort(ans.begin(),ans.end());
  70.        
  71.         for(int i = 0;i < ans.size();++i){
  72.             if(i > 0) putchar(' ');
  73.             printf("%d",ans[i]);
  74.         }
  75.        
  76.         putchar('\n');
  77.         putchar('\n');
  78.     }
  79.    
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement