通过DFS或者BFS分块,求有几块区域,需要注意的是与当前点相邻的有 上下左右 左上左下 右上右下 八个,其他的都没什么难度
//leehaoze
#include <iostream>
#include <deque>
#include <string>
#include <vector>
#include <queue>
#include <cstdio>
#include <stack>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int INF = 1<<29;
#define INC_SAT( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
#define ARR_SIZE( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )
#define ULL unsigned long long
#define MAXN (100 + 5)
struct Point{
Point(int x,int y):x_(x),y_(y){}
int x_,y_;
};
int Move_X[] = {0, 0, 1,-1,-1,-1, 1, 1};
int Move_Y[] = {1,-1, 0, 0,-1, 1,-1, 1};
char map[MAXN][MAXN];
bool visit[MAXN][MAXN];
int m,n;
bool Input(){
cin >> m >> n;
if(m == 0 && n == 0)return false;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
cin >> map[i][j];
visit[i][j] = false;
}
}
return true;
}
bool Legal(int dx,int dy){
return dx >= 0 && dx < m && dy >= 0 && dy < n && !visit[dx][dy] && map[dx][dy] == '@';
}
void DFS(Point start){
for (int i = 0; i < 8; ++i) {
int dx = start.x_ + Move_X[i];
int dy = start.y_ + Move_Y[i];
if(Legal(dx,dy)){
visit[dx][dy] = true;
DFS(Point(dx,dy));
}
}
}
int main() {
#ifdef LOCAL
freopen("IN.txt", "r", stdin);
#endif
std::ios::sync_with_stdio(false);
while(Input()){
int ans = 0;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if(map[i][j] == '@' && !visit[i][j]){
DFS(Point(i,j));
++ans;
}
}
}
cout << ans << endl;
}
}