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;
}