题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1241
题目大意:有一块n×m的土地,‘@’为油田,‘*’为空地,油田周围8个方向如果也有油田,那么算作一块油田。问这块土地上有几块油田。
题目思路:简单的搜索,从‘@’开始,把经过的‘@’周围8个方向的‘@’都搜索到,算作一块,最后统计搜索的次数。
AC代码:
// HDOJ
// 1241.cpp
/*
ID: Firwaless
LANG: C++
TASK: Oil Deposits
*/
#include <cstdio>
#include <cstring>
const int dir[8][2] = {0, 1, 0, -1, 1, 0, -1, 0, 1, 1, 1, -1, -1, 1, -1, -1};
char g[102][102];
void dfs(int x, int y)
{
int i, a, b;
g[x][y] = '*';
for (i = 0; i < 8; i++)
{
a = x + dir[i][0];
b = y + dir[i][1];
if (g[a][b] == '@')
{
dfs(a, b);
}
}
}
int main()
{
int i, j, n, m, ans;
while (scanf("%d%d%*c", &n, &m), (n || m))
{
ans = 0;
memset(g, '*', sizeof(g));
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
g[i][j] = getchar();
}
getchar();
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
if (g[i][j] == '@')
{
dfs(i, j);
ans++;
}
}
}
printf("%d\n", ans);
}
return 0;
}