​传送门​​​ 题意:经典例题。计算图中连通块(@)的个数即可。
思路;经典连通块问题.dfs求其个数即可。(不过我觉得这个想法很新颖!!超易懂,杜老师NB)。
直接八个方向DFS。

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<queue>
#include<cmath>
#include<cctype>
#include<stack>
#include<map>
#include<string>
#include<cstdlib>
#define ll long long
#define N 100010
using namespace std;
const ll maxn = 100 + 5;
//ll a[maxn],b[maxn];
bool vis[maxn][maxn];
string a[maxn];
int n, m;
void dfs(int x, int y) {
if(x < 0 || x >= n || y < 0 || y >= m || vis[x][y] || a[x][y] == '*')
return ;
vis[x][y] = 1;
dfs(x, y + 1);
dfs(x, y - 1);
dfs(x + 1, y);
dfs(x - 1, y);
dfs(x-1,y-1);
dfs(x+1,y+1);
dfs(x-1,y+1);
dfs(x+1,y-1);
}
int main() {
ll cnt = 0;
while(cin >> n >> m,n&&m) {
cnt = 0;
memset(vis,0,sizeof(vis));
for(int i = 0; i < n; i++)
cin >> a[i];
for(int i = 0; i < n; i++)
for(int j = 0; j < m; j++)
if(!vis[i][j] && a[i][j] == '@') {
dfs(i, j);
cnt++;
}
cout << cnt << endl;
}
return 0;
}