// 2004国内予選 問題B //再帰を使わない #include #define N 32 #define TRUE 1 #define FALSE 0 void print(int room[N][N], int w, int h) { int x,y; for(y=0; y<=h+1; y++){ for(x=0; x<=w+1; x++){ printf("%d ", room[x][y]); } printf("\n"); } } int main(void) { int w, h, x, y, ct, flag; int room[N][N]; char line[N]; while(1){ fgets(line, N, stdin); sscanf(line, "%d %d", &w, &h); printf("%d %d\n", w, h); if(w==0 && h==0) break; //上下左右にダミー用の壁を作っておく for(x=0; x<=w+1; x++){ room[x][0]=room[x][h+1]=1; } for(y=0; y<=h+1; y++){ room[0][y]=room[w+1][y]=1; } for(y=1; y<=h; y++){ fgets(line, N, stdin); //printf("%d %s\n", y, line); for(x=1; x<=w; x++){ if(line[x-1]=='.'){ room[x][y]=0; }else if(line[x-1]=='#'){ room[x][y]=1; }else if(line[x-1]=='@'){ room[x][y]=3; } } } //print(room,w,h); // .(0)上下左右に@(3)があったら、その点を@(3)にする // この操作を永久に繰り返し、変更が無くなったら終了 ct=1; while(1){ flag=FALSE; for(y=1; y<=h; y++){ for(x=1; x<=w; x++){ if(room[x][y]==0){ if(room[x-1][y]==3||room[x+1][y]==3|| room[x][y-1]==3||room[x][y+1]==3){ room[x][y]=3; flag=TRUE; ct++; } } } } if(!flag) break; } //print(room,w,h); printf("%d\n", ct); } return(0); }