题目链接
题目大意:
n *n 像素的照片,
. 是海洋
# 是陆地
上下左右四个方向连在一起的一片陆地 是岛屿 然后岛屿边缘一个像素的范围会被海水严
淹没
问 有多少岛屿会被完全淹没
解题思路:
居然自己写出来了 有点震惊
我先用 dfs 把岛屿全部标记了出来
然后再用 set 去重
代码如下:
#include<iostream>
#include<set>
using namespace std;
char a[1100][1100],mp[1100][1100];
int vis[1100][1100];
int d[4][2]={
{-1,0},{1,0},{0,-1},{0,1}};
int n;
int ans=0;
void dfs(int x,int y)
{
for(int i=0;i<4;i++)
{
int xx=x+d[i][0];
int yy=y+d[i][1];
if(xx>=0&&xx<n&&yy>=0&&yy<n&&mp[xx][yy]=='#')
{
vis[xx][yy]=ans;
mp[xx][yy]='.';
dfs(xx,yy);
}
}
}
int main()
{
int i,j,k,x;
int sum=0;
int flag;
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
cin>>mp[i][j];
a[i][j]=mp[i][j];
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(mp[i][j]=='#')
{
ans++;
mp[i][j]='.';
vis[i][j]=ans;
dfs(i,j);
}
}
}
set <int> s;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
flag=0;
if(a[i][j]=='#')
{
for(k=0;k<4;k++)
{
int xx=i+d[k][0];
int yy=j+d[k][1];
if(a[xx][yy]=='.')
{
flag=1;
break;
}
}
if(flag==0)
{
s.insert(vis[i][j]);
}
}
}
}
cout<<ans-s.size()<<endl;
return 0;
}