L - Oil Deposits (vj)

(dfs求连通块)怎么看着这么熟悉呢!原来是紫书上的一道例题……直接见注释吧


#include<bits/stdc++.h>
using namespace std;
const int maxn=100+5;
char Map[maxn][maxn];
int m,n,flag[maxn][maxn];
void dfs(int r,int c,int id)
{
    if(r<0||r>=m||c<0||c>=n) return ;//出界的格子
    if(flag[r][c]||Map[r][c]!='@') return ;//不是'@'或者已经访问过的格子
    flag[r][c]=id;//连通分量编号
    for(int i=-1;i<=1;i++)//搜索相邻及其对角线
        for(int j=-1;j<=1;j++)
        if(i||j) dfs(r+i,c+j,id);
}
int main()
{
    while(scanf("%d%d",&m,&n)==2&&m)
    {
        for(int i=0;i<m;i++) scanf("%s",Map[i]);
        memset(flag,0,sizeof(flag));
        int ans=0;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            if(!flag[i][j]&&Map[i][j]=='@') dfs(i,j,++ans);
        printf("%d\n",ans);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41061455/article/details/80349283