解题思路:找到每块大陆,然后判断每块大陆是否能够被淹没,如果大陆周围被大陆包围就不可能被淹没
注意事项:
参考代码:
#include<bits/stdc++.h>
using namespace std;
char a[1010][1010];
int b[1010][1010],x[4]={0,0,1,-1},y[4]={1,-1,0,0};
int n,sum;
int load(int k,int s)
{
int num=0;
for(int i=0;i<4;i++)
{
int xx=k+x[i],yy=s+y[i];
if(a[xx][yy]=='#')
num++;
}
return num;
} //找到每个'#'上下左右的大陆数量
void bfs(int p,int q)
{
if(b[p][q]=0)
return;
b[p][q]=0;
int flag=load(p,q);
if(p==1||p==n)
{
if(q==1||q==n)
{
if(flag==2)
sum++; //位于四个角的时候两个'#'就可以将大陆包围
}
else
{
if(flag==3)
sum++;//位于边界的时候需要3个'#'
}
}
else
{
if(flag==4)
sum++; //其他位置需要上下左右都有大#才能被包围
}
for(int i=0;i<4;i++)
{
int xx=p+x[i],yy=q+y[i];
if(xx>=1&&yy>=1&&xx<=n&&yy<=n&&b[xx][yy]==1)
bfs(xx,yy); //搜索大陆的数量
}
}
int main()
{
int count=0,num;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
if(a[i][j]=='.')
{
b[i][j]=0;
}
else
b[i][j]=1;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(b[i][j]==1)
{
sum=0;
bfs(i,j);
if(sum==0) //sum等于0说明一块大陆的每个#都没有被包围就会被淹没
{
count++; //被淹没的大陆数量就加1
}
}
}
}
cout<<count;
return 0;
}
0.0分
2 人评分