1.不沉的就是4个方向没有海,一个大岛屿有一个不沉就行了,其余染色就好了
2.第一个bfs来统计总岛屿个数
3.第二个来统计不沉岛屿个数
4.一减就ac啦
#include<bits/stdc++.h>
using namespace std;
#define N 100011
typedef long long ll;
typedef pair<ll,int> pii;
int n;
char mp[1011][1011];
bool a[1011][1011];
int dx[8]={-1,-1,0,1,1,1,0,-1};
int dy[8]={0,1,1,1,0,-1,-1,-1};
int wx[4]={-1,0,1,0};
int wy[4]={0,1,0,-1};
bool b[1011][1011];
typedef struct node
{
int x,y;
}node;
bool check(int x,int y)
{
if(mp[x][y]=='.') return false;
if(x+1<=n)
{
if(mp[x+1][y]=='.') return false;
}
if(y+1<=n) if(mp[x][y+1]=='.') return false;
if(x-1>=1) if(mp[x-1][y]=='.') return false;
if(y-1>=1) if(mp[x][y-1]=='.') return false;
return true;
}
void bfs(int x,int y)///这个bfs是找到了不沉海的岛屿,然后利用bfs染色其岛屿,
///最后遍历一遍就能知道原来的岛屿中 哪些是不沉的
{
a[x][y]=true;
queue<node> q;
q.push({x,y});
while(q.size())
{
node t=q.front();
q.pop();
int x=t.x,y=t.y;
for(int i=0;i<4;i++)
{
int tx=x+wx[i];
int ty=y+wy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n)
{
if(!a[tx][ty]&&mp[tx][ty]=='#')
{
a[tx][ty]=true;
q.push({tx,ty});
}
}
}
}
}
void bfs1(int x,int y)///找总岛屿个数
{
b[x][y]=true;
queue<node> q;
q.push({x,y});
while(q.size())
{
node t=q.front();
q.pop();
int x=t.x,y=t.y;
for(int i=0;i<4;i++)
{
int tx=x+wx[i];
int ty=y+wy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n)
{
if(!b[tx][ty]&&mp[tx][ty]=='#')
{
b[tx][ty]=true;
q.push({tx,ty});
}
}
}
}
}
ll an,am;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>mp[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(mp[i][j]=='#'&&!b[i][j])
{
bfs1(i,j);
am++;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(mp[i][j]=='#'&&check(i,j)&&!a[i][j])///满足check就不沉,一个岛屿有一个就行‘
///剩下就染色防止重复遍历就行了
{
bfs(i,j);
an++;
}
}
}
cout<<am-an;
return 0;
}