输入
7
.......
.##....
.##....
....##.
..####.
...###.
.......在这里插入代码片
输出
7
…
.##…
.##…
…##.
…####.
…###.
…
在这里插入代码片
#include<iostream>
#include<vector>
using namespace std;
char a[1000][1000];
int visit[1000][1000]={0};
int dpx[4]={1,0,-1,0},dpy[4]={0,1,0,-1};//右、左、上、下
int n;
int check(int x,int y) //判定是否过边界
{
if(x>=n||y>=n||x<0||y<0)//过界
return 1;
return 0;
}
void dfs(int i,int j,int t)//遍历属于一个岛的visit的值一样
{
if(a[i][j]!='#'||visit[i][j]!=0)//遇到海或者已经遍历过的返回
return;
if(check(i,j))//越界返回
return;
visit[i][j]=t;
for(int k=0;k<4;k++)//四个方向遍历
{
dfs(i+dpx[k],j+dpy[k],t);
}
}
int main()
{
cin>>n;
vector<int> res(n*n+1,0);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
cin>>a[i][j];
}
}
int t=0;
for(int i=0;i<n;i++)//遍历整个区间
{
for(int j=0;j<n;j++)
{
if(a[i][j]=='#'&&visit[i][j]==0)//只有当是陆地且没有访问的才遍历
dfs(i,j,++t);
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(a[i][j]=='#')//上下左右任意一个方位有海且没有越界,该地变成海
{
for(int k=0;k<4;k++)
{
if(check(i+dpx[k],j+dpy[k])==0&&a[i+dpx[k]][j+dpy[k]]=='.')
{
visit[i][j]=0;
break;
}
}
}
}
for(int i=0;i<n;i++)//用数组res下标当作岛的编号
{
for(int j=0;j<n;j++)
{
res[visit[i][j]]++;
}
}
int ans=0;
for(int i=1;i<=n*n;i++)//当岛编号对应res大于0证明该岛没有淹没
{
if(res[i]>0)
ans++;
}
cout<<t-ans;//输出被淹没的岛的数量
return 0;
}