模板题,题目就不说了

思路就是新建一个标签数组,如果两个油田是联通的,那么他们的编号是相同的,然后进行遍历,每找到一块新的油田,那么标签+1,标签即答案

代码如下:

#include <cstdio>
char grid[105][105];
int tag[105][105];
int n, m;
void dfs(int x, int y, int mark)
{
    //越界检查
    if(x < 0||y < 0||x >= n||y >= m)
        return;
    //若不是油田或者已经被标记了
    if(grid[x][y] == '*'||tag[x][y])
        return;
    //至此,该坐标符合条件
    tag[x][y] = mark;
    for (int i = -1; i < 2;++i)
        for (int j = -1; j < 2;++j)
        //不对自己进行深搜,否则导致无限递归
        if(!(i == 0&&j == 0))
            dfs(x + i, y + j, mark);
}
int main()
{
    int mark;
    while(scanf("%d%d",&n,&m) != EOF) {
        if(n == 0)
            break;
        //初始化
        mark = 0;
        for (int i = 0; i < n;++i)
            for (int j = 0; j < m;++j)
                tag[i][j] = 0;
        //输入
        for (int i = 0; i < n; i++)
            scanf("%s", grid[i]);
        //进行深搜
        for (int i = 0; i < n;i++)
            for (int j = 0; j < m;j++)
            if(grid[i][j] == '@'&&!tag[i][j])
                dfs(i, j, ++mark);
        printf("%d\n", mark);
    }
    return 0;
}