AISing Programming Contest 2019C(DFS,BFS)

#include<bits/stdc++.h>
using namespace std;
int n,m;
long long a=0,b=0,ans=0;
char s[407][407];
int vis[407][407];
const int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
void dfs(int x,int y){
    vis[x][y]=1;
    if(s[x][y]=='#')
        b++;
    else if(s[x][y]=='.')
        a++;
    for(int i=0;i<4;i++)
        if(x+dir[i][0]>0&&x+dir[i][0]<=n&&y+dir[i][1]<=m&&y+dir[i][1]>0&&!vis[x+dir[i][0]][y+dir[i][1]]&&s[x+dir[i][0]][y+dir[i][1]]!=s[x][y])
        //不同的点就继续dfs
            dfs(x+dir[i][0],y+dir[i][1]);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%s",s[i]+1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(!vis[i][j])
                a=b=0,dfs(i,j),ans+=a*b;//.和#的数目相乘即为这一条块的答案,原因相当于枚举起点终点情况为乘积和
    printf("%lld",ans);
    return 0;
}

保持热爱 不懈努力 不试试看怎么知道会失败呢(划掉) 世上无难事 只要肯放弃(划掉)
原文地址:https://www.cnblogs.com/ldudxy/p/10457041.html