#include #include ifstream in("dice.in"); int n,m; int t[60][60]; int s[60][60]; int d[2600]; int f[2600]; void union1(int cerca, int nuovo) { int i,j; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (t[i][j] == cerca) t[i][j] = nuovo; } void union2(int cerca, int nuovo) { int i,j; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (s[i][j] == cerca) s[i][j] = nuovo; } void fai1() { int i,j,k; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (t[i][j]) { k = t[i][j]; if (t[i-1][j] && (i > 0)) if (t[i-1][j] != k) union1(t[i-1][j],k); if (t[i][j-1] && (j > 0)) if (t[i][j-1] != k) union1(t[i][j-1],k); if (t[i+1][j] && (i < (m-1))) if (t[i+1][j] != k) union1(t[i+1][j],k); if (t[i][j+1] && (j < (n-1))) if (t[i][j+1] != k) union1(t[i][j+1],k); } } void fai2() { int i,j,k; for (i = 0; i < m; i++) for (j = 0; j < n; j++) if (s[i][j]) { k = s[i][j]; if (s[i-1][j] && (i > 0)) if (s[i-1][j] != k) union2(s[i-1][j],k); if (s[i][j-1] && (j > 0)) if (s[i][j-1] != k) union2(s[i][j-1],k); if (s[i+1][j] && (i < (m-1))) if (s[i+1][j] != k) union2(s[i+1][j],k); if (s[i][j+1] && (j < (n-1))) if (s[i][j+1] != k) union2(s[i][j+1],k); } } void computa(void) { int i,j,k,aux; fai1(); fai2(); for (i = 0; i <= 2500; i++) d[i] = 0; for (i = 0; i< m; i++) for (j = 0; j < n; j++) if (s[i][j]) { d[t[i][j]]++; union2(s[i][j],0); } i = 1; for (k = 1; k <= 2500; k++) { if (d[k]) { aux = d[k]; for (j = i - 1; (j >= 0) && (f[j] > aux); j--) f[j+1] = f[j]; f[j+1] = aux; i++; } } for (k = 1; k < (i-1); k++) cout << f[k] << " "; cout << f[i-1] << "\n\n"; } void main() { char riga[101]; int i,j, num; num = 1; while (in >> n >> m, m || n) { int cont; cont = 1; for (i = 0; i < m; i++) { in >> riga; for (j = 0; j < n; j++) if (riga[j] == '*') { t[i][j] = cont++; s[i][j] = 0; } else if (riga[j] == 'X') { t[i][j] = cont; s[i][j] = cont++; } else { t[i][j] = 0; s[i][j] = 0; } } cout << "Throw " << num++ << "\n"; computa(); } in.close(); }