思路:bfs
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define eps 10e-10
#define PI acos(-1.0)//3.14159265
const int MAX_ = 1010;
const int N = 100010;
const int INF = 0x7fffffff;
queue<int >q;
bool vis[MAX_][MAX_];
char str[MAX_][MAX_];
int dir[8][2] = {{0,-1},{-1,-1},{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1}};
int n,m;
void bfs(int x,int y){
q.push(x);
q.push(y);
vis[y][x] = 1;
while(!q.empty()){
int curx, cury;
curx = q.front();
q.pop();
cury = q.front();
q.pop();
for(int i = 0 ; i < 8; ++i){
int nextx, nexty;
nextx = curx + dir[i][0];
nexty = cury + dir[i][1];
if((nextx >= 0 && nextx < m) && (nexty >= 0 && nexty < n) && str[nexty][nextx] == '@'){
if(!vis[nexty][nextx]){
vis[nexty][nextx] = 1;
q.push(nextx);
q.push(nexty);
}
}
}
}
}
int main(){
int ans;
while(scanf("%d%d",&n,&m), n||m){
for(int i = 0; i < n; ++i){
scanf("%s",str[i]);
}
mst(vis,0);
while(!q.empty())q.pop();
ans = 0;
for(int i = 0; i < n; ++i){
for(int j = 0; j < m; ++j){
if(str[i][j] == '@' && !vis[i][j]){
bfs(j,i);
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}