1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 queue q; 8 int main() 9 { 10 int i, w, h, k, j; 11 int visit[21][21]; 12 char s[21][21]; 13 14 while(scanf("%d%d", &w, &h) != EOF) 15 { 16 if(w==0 && h==0) break; 17 getchar(); //此处是为了处理enter换行键,不能省,此处较容易出错,我也是调了两个小时才恍然大悟。 18 for(i=1; i<=h; i++) 19 { 20 for(j=1; j<=w; j++) 21 { 22 scanf("%c",&s[i][j]); 23 if(j==w) getchar();//此处和上述一样为了处理换行符。 24 } 25 } 26 for(i=1; i<=h; i++) 27 { 28 for(j=1; j<=w; j++) 29 { 30 if(s[i][j]=='@') 31 { 32 visit[i][j] = 1;//标记后就不能访问了 33 q.push(i); 34 q.push(j); 35 } 36 if(s[i][j]=='#') 37 visit[i][j] = 1;//和上述标记一样 38 if(s[i][j]=='.') 39 visit[i][j] = 0; 40 } 41 } 42 k = 0; //每次访问结束后队首出队,记录出队多少次,就可知道访问几次,从而可判断访问到了几个',' 43 while(!q.empty()) 44 { 45 int x, y; 46 x = q.front(); 47 q.pop(); 48 y = q.front(); 49 q.pop(); 50 k++; 51 if(visit[x-1][y]==0 && x-1>=1) 52 { 53 visit[x-1][y] = 1; 54 q.push(x-1); 55 q.push(y); 56 } 57 if(visit[x+1][y]==0 && x+1<=h) 58 { 59 visit[x+1][y] = 1; 60 q.push(x+1); 61 q.push(y); 62 } 63 if(visit[x][y+1]==0 && y+1<=w) 64 { 65 visit[x][y+1] = 1; 66 q.push(x); 67 q.push(y+1); 68 } 69 if(visit[x][y-1]==0 && y-1>=1) 70 { 71 visit[x][y-1] = 1; 72 q.push(x); 73 q.push(y-1); 74 } 75 } 76 printf("%d\n",k); 77 } 78 return 0; 79 } 80 81