#include #include #include #include #include char a[100][100]; void processx(int x, int y) { int qx[3000]; int qy[3000]; int head = 1; int tail = 0; qx[0] = x; qy[0] = y; while(head != tail) { x = qx[tail]; y = qy[tail]; tail++; a[x][y] = '*'; if(a[x-1][y] == 'X') { qx[head] = x - 1; qy[head] = y; a[x-1][y] = '*'; head++; } if(a[x+1][y] == 'X') { qx[head] = x + 1; qy[head] = y; a[x+1][y] = '*'; head++; } if(a[x][y-1] == 'X') { qx[head] = x; qy[head] = y-1; a[x][y-1] = '*'; head++; } if(a[x][y+1] == 'X') { qx[head] = x; qy[head] = y + 1; a[x][y+1] = '*'; head++; } } } int search(int x, int y) { int qx[3000]; int qy[3000]; int head = 1; int tail = 0; int count = 0; qx[0] = x; qy[0] = y; while(head != tail) { x = qx[tail]; y = qy[tail]; tail++; a[x][y] = '.'; if(a[x-1][y] == 'X') { qx[head] = x - 1; qy[head] = y; head++; processx(x-1, y); count++; } if(a[x+1][y] == 'X') { qx[head] = x + 1; qy[head] = y; head++; processx(x+1, y); count++; } if(a[x][y-1] == 'X') { qx[head] = x; qy[head] = y-1; head++; processx(x,y-1); count++; } if(a[x][y+1] == 'X') { qx[head] = x; qy[head] = y + 1; head++; processx(x,y+1); count++; } if(a[x-1][y] == '*') { qx[head] = x - 1; qy[head] = y; a[x-1][y] = '.'; head++; } if(a[x+1][y] == '*') { qx[head] = x + 1; qy[head] = y; a[x+1][y] = '.'; head++; } if(a[x][y-1] == '*') { qx[head] = x; qy[head] = y-1; a[x][y-1] = '.'; head++; } if(a[x][y+1] == '*') { qx[head] = x; qy[head] = y + 1; a[x][y+1] = '.'; head++; } } return count; } void read(ifstream& in, int x, int y) { char buffer[100]; for(int i = 0; i < y + 2; i++) for(int j = 0; j < x + 2; j++) a[j][i] = '.'; in.getline(buffer, sizeof(buffer)); for(int z = 0; z < y; z++) { in.getline(buffer, sizeof(buffer)); for(int s = 1; s <= x; s++) { a[s][z + 1] = buffer[s - 1]; } } } int res[10000]; int cmp(const void *p1, const void *p2) { int i1 = *(int*)p1; int i2 = *(int*)p2; if(i1 < i2) return -1; if(i1 > i2) return 1; return 0; } int main() { ifstream in("dice.in"); int x, y; int run = 0; while(1) { in >> x; in >> y; //cout << x << " " << y; //cout.flush(); if(x == 0 && y == 0) return 1; run++; cout << "Throw " << run << "\n"; read(in, x, y); //cout << "read ok"; //cout.flush(); int dicecount = 0; for(int z = 1; z <= y; z++) { for(int s = 1; s <= x; s++) { if(a[s][z] == '*') res[dicecount++] = search(s, z); } } qsort(res, dicecount, sizeof(int), cmp); for(int i = 0; i < dicecount; i++) cout << res[i] << " "; cout << "\n\n"; } return 0; }