题意:'@'表示油田,'*'表示墙,问n*m的地图上有几块油田?↑↓←→↖↙↗↘八个方向相连算同一块油田。
思路:BFS或DFS求连通块。遍历整个图每找到一次'@',进行一次BFS把油田改为'*',答案++。
#include<bits/stdc++.h>
using namespace std;
int n, m, dir[8][2] = {{1, 0}, {0, 1}, {0, -1}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
char MAP[105][105];
pair<int, int> NOW;
void bfs(int sx,int sy)
{
queue<pair<int, int> > q;
q.push(make_pair(sx, sy));
while (!q.empty())
{
NOW = q.front();
q.pop();
for (int i = 0; i < 8; i++)
{
int X = NOW.first + dir[i][0], Y = NOW.second + dir[i][1];
if (X >= 0 && Y >= 0 && X < n && Y < m && MAP[X][Y] == '@')
{
MAP[X][Y] = '*';
q.push(make_pair(X, Y));
}
}
}
}
int main()
{
while (~scanf("%d%d", &n, &m) && (n + m))
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> MAP[i][j];
}
}
int ans = 0;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (MAP[i][j] == '@')
{
bfs(i, j);
ans++;
}
}
}
printf("%d\n",ans);
}
return 0;
}
/*
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
*/