题目链接:
传送门
#include <iostream>
using namespace std;
const int N = 101;
int op[8][2] = { {1,0}, {-1,0}, {0,1} , {0,-1} , {1,-1} , {1,1} , {-1,-1} , {-1,1} };
char map[N][N];
int m, n;
//判断是否出界
bool over(int x, int y)
{
return (x < 0) || (y < 0) || (x > n - 1) || (y > m - 1);
}
void dfs(int a, int b)
{
if (map[a][b] != '@' || over(a, b))return;
map[a][b] = '*';
for (int i = 0; i < 8; i++)
dfs(a + op[i][0], b + op[i][1]);
return;
}
int main()
{
int ans;
while (cin >> n >> m)
{
if (m == 0 && n == 0)break;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> map[i][j];
ans = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (map[i][j] == '@')
{
dfs(i, j);
ans++;
}
cout << ans << endl;
}
return 0;
}
这算是一道简单的dfs问题了,就是查找连通块,往外扩展搜到无法搜索为止。然后遍历在所有点搜一次就好了。