Loading

[HDU - 1241]Oil Deposits

也是很简单的DFS水题,就跟求有多少连通块差不多。(只有上下左右四个方向有联通才是连通块)

#include<cstdio>
#include <cstring>
using namespace std;
int m, n,cnt = 0;
char A[101][101];
int vis[101][101];

void dfs(int i, int j)
{
    if(i < 0|| j < 0|| i >= m|| j >= n || vis[i][j] || A[i][j] != '@')
        return;
    else
    {
        //这里当然也可以开一个dic数组用for来遍历,但是这个是我早期代码,只是做个归档故不再优化。
        vis[i][j] = 1;
        dfs(i-1, j-1);
        dfs(i-1, j);
        dfs(i-1, j+1);
        dfs(i, j-1);
        dfs(i, j+1);
        dfs(i+1, j-1);
        dfs(i+1, j);
        dfs(i+1, j+1);//dfs的精髓!
        //这道题就不需要重置了,因为油田不能重复出现
    }

}


int main()
{
    while(~scanf("%d%d", &m, &n) && (m+n))
    {
        cnt = 0;
        memset(A, 0, sizeof(A));
        memset(vis, 0, sizeof(vis));
        for(int i = 0; i < m; ++i)
            scanf("%s", A[i]);

        for(int i = 0; i < m; ++i)
            for(int j = 0; j < n; ++j)
                if(!vis[i][j] && A[i][j] == '@')
                    dfs(i, j),cnt++;
        printf("%d\n", cnt);
    }
}

 

posted @ 2019-08-20 13:39  ViKyanite  阅读(116)  评论(0编辑  收藏  举报