// DFS
#include<bits/stdc++.h>
using namespace std;
#define mem( a,v ) memset( a,v,sizeof(a) )
const int N=1111;
char mp[N][N];
bool used[N][N];
int dx[4]={ -1,1,0,0 }; // 上下左右
int dy[4]={ 0,0,-1,1 };
int flag; // ==1 存在高地, ==0 被淹没
void dfs( int x,int y )
{
int i,nx,ny;
used[x][y]=1;
for( i=0;i<4;i++ ) // 判断高地
if( mp[ x+dx[i] ][ y+dy[i] ] != '#' ) break;
if( i==4 ) flag=1;
for( i=0;i<4;i++ ) // 标记整个岛屿
{
nx=x+dx[i],ny=y+dy[i];
if( used[nx][ny]==0 && mp[nx][ny]=='#' ) dfs( nx,ny );
}
}
void init()
{
mem(mp,0);
mem(used,0);
// memset( mp,0,sizeof( mp ) );
// memset( used,0,sizeof( used ) );
}
int main()
{
int n,i,j,ans;
while( cin>>n )
{
init();
// for( i=0;i<n;i++ ) cin>>mp[i];
for( i=0;i<n;i++ )
{
cin.get();
for( j=0;j<n;j++ ) cin>>mp[i][j];
}
ans=0;
for( i=0;i<n;i++ )
for( j=0;j<n;j++ )
if( used[i][j]==0 && mp[i][j]=='#' )
{
flag=0;
dfs( i,j );
if( flag==0 ) ans++;
}
cout<<ans<<endl;
}
return 0;
}
--------> y
| 0 1 2
| 1
| 2
>
x
int dx[4]={ -1,1,0,0 }; // 上下左右
int dy[4]={ 0,0,-1,1 };
int dx[4]={ 0,1,0,-1 }; // 东南西北
int dy[4]={ 1,0,-1,0 };