#include #include char pole[300000]; char dice[300000]; #define I(x,y) ((x) * 502 + (y)) void scpy(int x, int y) { if (pole[I(x,y)] == '.') return; dice[I(x,y)] = pole[I(x,y)]; pole[I(x,y)] = '.'; scpy(x+1,y); scpy(x-1,y); scpy(x,y+1); scpy(x,y-1); } void sdelX(int x, int y) { if (dice[I(x,y)] == 'X') { dice[I(x,y)] = '.'; sdelX(x+1,y); sdelX(x-1,y); sdelX(x,y+1); sdelX(x,y-1); } } int sort_n(const void *pa, const void *pb) { if ((*(int*)pa) > (*(int*)pb)) return 1; else if ((*(int*)pa) < (*(int*)pb)) return -1; else return 0; } int main(void) { int H, W, i, j, k, l; int throw[1000]; int n_throw = 0; while(1) { // nacteni scanf("%d %d\n",&H, &W); if (H == 0 && W == 0) return 0; memset(pole,'.',300000); for (i = 1; i <= H; i++) gets(pole + 1 + i * 502); // vypocet n_throw = 0; for (i = 1; i <= H; i++) for (j = 1; j <= W; j++){ if(pole[I(i,j)] != '.') { memset(dice,'.',300000); scpy(i,j); throw[n_throw]=0; for(k = 1; k <= H; k++) for (l = 1; l <= W; l++) if (dice[I(k,l)] == 'X'){ throw[n_throw]++; sdelX(k,l); } n_throw++; } } // trideni a vypis qsort((void *)throw, n_throw, sizeof(int), sort_n); printf("Throw:"); for (i = 0; i < n_throw; i++) printf(" %d",throw[i]); printf("\n"); } return 0; }