所需知识:flood fill(求连通块),dfs,bfs
思路:从整块地图起点开始找陆地,然后将与这块陆地连接的整块岛屿遍历并标记,并判断每个岛屿中是否存在四面都是陆地的陆地,若存在则将计数器加一,若不存在则继续找与这块陆地不相连的下一块陆地,直到遍历完整块地图。
C++代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int N;
char Map[1005][1005];
int vis[1005][1005];
int Move[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int ans;
int flag;
void dfs(int x,int y){
vis[x][y]=1;
if(Map[x-1][y]=='#'&&Map[x+1][y]=='#'&&Map[x][y-1]=='#'&&Map[x][y+1]=='#')
flag=1;
for (int i = 0; i < 4; i ++ ){
int nx=x+Move[i][0];
int ny=y+Move[i][1];
if(!vis[nx][ny]&&Map[nx][ny]=='#')
dfs(nx,ny);
}
return;
}
int main()
{
cin>>N;
for (int i = 1; i <= N; i ++ ){
for (int j = 1; j <= N; j ++ )
cin>>Map[i][j];
}
for (int i = 1; i <= N; i ++ ){
for (int j = 1; j <= N; j ++ ){
if(Map[i][j]=='#'&&vis[i][j]==0){
flag=0;
dfs(i,j);
if(!flag)
ans++;
}
}
}
cout<<ans;
return 0;
}