#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
int n;
const int num=1005;
bool vis[num][num];//标记该点是否被查过
int ans[num]={0};//记录每个连通块有几块陆地不被淹没
char mp[num][num];//存图
int land=0,flood=0;//land是连通块数量,flood是沉没的连通块数量
void dfs(int a,int b,int k)
{
if(mp[a][b]=='.') return;
if(vis[a][b]) return;
if(mp[a+1][b]=='#'&&mp[a-1][b]=='#'&&mp[a][b+1]=='#'&&mp[a][b-1]=='#') ans[k]++;
vis[a][b]=1;//标记已经找过这个点
dfs(a+1,b,k);
dfs(a-1,b,k);
dfs(a,b+1,k);
dfs(a,b-1,k);
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>mp[i][j];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
//找到陆地就dfs该岛屿,如果不存在无法淹没的陆地块,被淹没的岛屿数量+1
if(mp[i][j]=='#'&&!vis[i][j])
{
dfs(i,j,land);
//被淹没的岛屿数量++
land++;
}
}
}
for(int i=0;i<land;i++)
{
//如果连通块内没有不被淹没的陆地
if(ans[i]==0)
flood++;
}
cout<<flood<<endl;
}