杭电1312

1 //1312红与黑 2 #include<stdio.h> 3 #include<string.h> 4 #include<queue> 5 using namespace std; 6 char a[21][21]; 7 int m,n; 8 int sum; 9 int d[4][2]={1,0,-1,0,0,1,0,-1}; 10 struct node 11 { 12 int x,y; 13 }; 14 15 int judge(int x,int y) 16 { 17 if(x>=0&&x<n&&y>=0&&y<m&&a[x][y]=='.') 18 return 1; 19 else 20 return 0; 21 } 22 23 void bfs(int x,int y) 24 { 25 int k; 26 27 queue<node>q; 28 node cur,next; 29 cur.x=x; 30 cur.y=y; 31 q.push(cur); 32 sum++;//将第一个加上; 33 a[x][y]='#';//把第一个置为'#',保证下次不再重复计算 34 while(!q.empty()) 35 { 36 cur=q.front(); 37 q.pop(); 38 39 for(k=0;k<4;k++) 40 { 41 next.x=x=cur.x+d[k][0]; 42 next.y=y=cur.y+d[k][1]; 43 if(judge(x,y))//判断四个方位是否为黑色砖 44 { 45 a[x][y]='#';//满足条件的置为'#' 46 47 q.push(next); 48 sum++; 49 } 50 } 51 52 } 53 54 } 55 56 int main() 57 { 58 int i,j,t,x,y; 59 while(scanf("%d%d",&m,&n),m!=0||n!=0) 60 { 61 getchar(); 62 sum=0; 63 for(i=0;i<n;i++) 64 { 65 scanf("%s",a[i]); 66 } 67 for(i=0;i<n;i++) 68 { 69 for(j=0;j<m;j++) 70 { 71 if(a[i][j]=='@') 72 { 73 x=i;y=j; 74 break; 75 } 76 } 77 } 78 bfs(x,y); 79 printf("%d\n",sum); 80 } 81 return 0; 82 }