#include #include #include int dice(int x, int y); int dot(int x, int y); int s[505][505]; char p[505][505]; int maxx,maxy; int main(int ac, char ** av) { int nl=0; int cisla[1000]; while(1){ scanf("%d %d\n", &maxx,&maxy); if (maxx==0) break; if (nl) putchar('\n'); else nl=1; for(int i=1;i<=maxx;i++){ gets(p[i]+1); memset(s[i],0,sizeof(int)*(maxy+2)); } int poc=0; for(int x=1;x<=maxx;x++){ for(int y=1;y<=maxy;y++){ if (s[x][y]!=0) continue; if (p[x][y]=='*' || p[x][y]=='X') cisla[++poc]=dice(x,y); else s[x][y]=3; } //for y } //for x printf("Throw:"); for (int i=1; i<=poc;i++) printf(" %d",cisla[i]); } //while return 0; } int dice(int x, int y){ int bodu=0; if (x>maxx || y>maxy || x<1 || y<1) return 0; if (s[x][y]==1 || s[x][y]==3) return 0; if (p[x][y]=='.') return 0; if (p[x][y]=='*') s[x][y]=1; else if (s[x][y]==0){ s[x][y]=1; bodu=1; dot(x,y); } else s[x][y]=3; return bodu+dice(x+1,y)+dice(x,y+1)+dice(x-1,y)+dice(x,y-1); } int dot(int x, int y){ if (x>maxx || y>maxy || x<1 || y<1) return 0; if (s[x][y]==2 || s[x][y]==3) return 0; if (p[x][y]!='X') return 0; if (s[x][y]==0) s[x][y]=2; else s[x][y]=3; dot(x, y+1); dot(x+1, y); dot(x-1, y); dot(x, y-1); return 0; }