#include #include char mat[60][60]; int w,h; char dice[60][60]; void init_dice() { int i,j; for( i = 0; i < 60; i++ ) for( j = 0; j < 60; j++ ) dice[i][j] = '.'; } int comp( const void *p1, const void *p2 ) { return ( *( int* ) p1 - *( int* ) p2 ); } int vis(int i, int j ) { int dx,dy; if( i < 0 || i >= h || j < 0 || j >= w ) return; if( dice[i][j] == '.' ) return; dice[i][j] = '.'; for( dx = -1; dx < 2; dx++ ) for( dy = -1; dy < 2; dy++ ) { if ( dx * dy ) continue; vis( i + dx, j +dy ); } } int scan_dice() { int i,j, score = 0; for( i = 0; i < 60; i++ ) for( j = 0; j < 60; j++ ) if( dice[i][j] == 'X' ) { score++; vis( i, j ); } return score; } void visit(int i, int j ) { int dx,dy; if( i < 0 || i >= h || j < 0 || j >= w ) return; if( mat[i][j] == '.' ) return; if( mat[i][j] == 'X' ) dice[i][j] = 'X'; mat[i][j] = '.'; for( dx = -1; dx < 2; dx++ ) for( dy = -1; dy < 2; dy++ ) { if ( dx * dy ) continue; visit( i + dx, j +dy ); } } int main() { int i,j,k = 0, p; int score[10000]; FILE *fp; fp = fopen( "dice.in", "r" ); while( 1 ) { k++; fscanf( fp, " %d %d", &w, &h ); if( w == 0 ) break; p = 0; for( i = 0; i < h; i++ ) fscanf( fp, " %s", mat[i] ); for( i = 0; i < h; i++ ) for( j = 0; j < w; j++ ) if( mat[i][j] != '.' ) { init_dice(); visit( i, j ); score[p++] = scan_dice(); } qsort( score, p, sizeof( int ), comp ); printf("Throw %d\n", k ); for( i = 0; i < p-1; i++ ) printf("%d ", score[i]); printf("%d\n\n", score[p-1]); } return 0; }