#include #include typedef struct { int i,j; } Dvojica; static int w,h; static char A[600][600]; static char OA[600][600], IA[600][600]; static int B[100000], cB; static Dvojica OZ[500*500], IZ[500*500]; static int cOZ, cIZ; void in_look(i,j) { cIZ=1; IZ[0].i=i; IZ[0].j=j; IA[i][j]=1; while (cIZ>0) { cIZ--; i=IZ[cIZ].i; j=IZ[cIZ].j; A[i][j]='*'; if (!IA[i][j+1] && A[i][j+1]=='X' ) { IZ[cIZ].i=i; IZ[cIZ++].j=j+1; IA[i][j+1]=1; } if (!IA[i][j-1] && A[i][j-1]=='X' ) { IZ[cIZ].i=i; IZ[cIZ++].j=j-1; IA[i][j-1]=1; } if (!IA[i-1][j] && A[i-1][j]=='X' ) { IZ[cIZ].i=i-1; IZ[cIZ++].j=j; IA[i-1][j]=1; } if (!IA[i+1][j] && A[i+1][j]=='X' ) { IZ[cIZ].i=i+1; IZ[cIZ++].j=j; IA[i+1][j]=1; } } } int out_look(i,j) { int ociek=0; cOZ=1; OZ[0].i=i; OZ[0].j=j; OA[i][j]=1; while (cOZ>0) { cOZ--; i=OZ[cOZ].i; j=OZ[cOZ].j; if (A[i][j]=='X') { ociek++; in_look(i,j);} A[i][j]='.'; if (!OA[i][j+1] && (A[i][j+1]=='X' || A[i][j+1]=='*')) { OZ[cOZ].i=i; OZ[cOZ++].j=j+1; OA[i][j+1]=1; } if (!OA[i][j-1] && (A[i][j-1]=='X' || A[i][j-1]=='*')) { OZ[cOZ].i=i; OZ[cOZ++].j=j-1; OA[i][j-1]=1; } if (!OA[i-1][j] && (A[i-1][j]=='X' || A[i-1][j]=='*')) { OZ[cOZ].i=i-1; OZ[cOZ++].j=j; OA[i-1][j]=1; } if (!OA[i+1][j] && (A[i+1][j]=='X' || A[i+1][j]=='*')) { OZ[cOZ].i=i+1; OZ[cOZ++].j=j; OA[i+1][j]=1; } } return ociek; } int icmp( int *a, int *b) { return (*a)-(*b); } int main(void) { while(1) { int i,j; scanf("%d %d ",&h,&w); if (h==0 && w==0) break; for (j=0; j<=w; j++) { A[0][j]=0; A[h+1][j]=0;} for (i=1; i<=h; i++) { A[i][0]=0; gets(A[i]+1); } for (i=0; i<=h+1; i++) for (j=0; j<=w+1; j++) { OA[i][j]=IA[i][j]=0; } cB=0; for (i=1; i<=h; i++) for (j=1; j<=w; j++) if (A[i][j]=='*' || A[i][j]=='X') { B[cB++]=out_look(i,j); } qsort(B,cB,sizeof(B[0]),icmp); printf("Throw:"); for (i=0; i