第九届蓝桥杯B组-全球变暖(dfs)

1、先把联通岛屿进行染色
2、判断符合条件的岛屿颜色个数

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> P;
const int N=1e3+9;
#define line '\n'
char c[N][N];
int n,now;
unordered_set<int> S;
int vis[N][N];
int go[4][2]={0,1,-1,0,1,0,0,-1};
inline int read(){int op=1,x=0;char cc=getchar();while(!isdigit(cc)){if(cc=='-')op=-1;cc=getchar();}while(isdigit(cc))x=x*10+cc-48,cc=getchar();return x*op;}
void dfs(int x,int y,int color)
{
    vis[x][y]=color;
    for(int i=0;i<4;++i){
        int xx=x+go[i][0];
        int yy=y+go[i][1];
        if(xx<0||x>=n||yy<0||yy>=n)continue;
        if(!vis[xx][yy]&&c[xx][yy]=='#')dfs(xx,yy,color);
    }
}
int get(int x,int y)
{
    if(c[x][y]!='#')return 0;
    for(int i=0;i<4;++i){
        int xx=x+go[i][0];
        int yy=y+go[i][1];
        if(xx<0||x>=n||yy<0||yy>=n)return 0;
        if(c[xx][yy]!='#')return 0;
    }
    return vis[x][y];
}
int main()
{
    n=read();
    for(int i=0;i<n;++i)for(int j=0;j<n;++j)cin>>c[i][j];
    for(int i=0;i<n;++i)for(int j=0;j<n;++j)if(c[i][j]=='#'&&!vis[i][j])dfs(i,j,++now);
    for(int i=1;i<n;++i)for(int j=1;j<n;++j)if(get(i,j)!=0)S.insert(get(i,j));
    cout<<now-S.size()<<line;
    return 0;   
}
上一篇:CSP前的板子


下一篇:利用DFS算出有多少个连通图