P8662 [蓝桥杯 2018 省 AB] 全球变暖 题解
分析
简单的暴力题。
思路很简单,如果一块陆地上下左右都是陆地,就算与他相邻的陆地都被淹没,那这块地也不会被淹,这个小岛就没有被完全淹没。所以我们只需要遍历一遍,看每个岛的陆地是否沿海即可。
直接 DFS,实现方法详见代码。
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
char a[N][N];
int n,ans,xx[] = {1,-1,0,0},yy[] = {0,0,1,-1};
bool v = 1,vis[N][N];//v来记录返回值,vis数组打标记
bool ok(int x,int y)//单纯是为了方便,判断是否是陆地
{
return a[x][y]!='.';
}
bool dfs(int x,int y)
{
vis[x][y] = 1;//遍历过了,标记为1
if(ok(x-1,y)&&ok(x+1,y)&&ok(x,y-1)&&ok(x,y+1))//上下左右都是陆地,不沿海,那么这个岛不会被完全淹没
v = 0;
for(int i = 0;i<4;i++)//扩张
{
int X = x+xx[i],Y = y+yy[i];
if(ok(X,Y)&&vis[X][Y]==0)//没遍历过并且是陆地,那么此区域属于这片岛屿
dfs(X,Y);
}
a[x][y] = '.';
return v;
}
signed main()
{
cin>>n;
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
cin>>a[i][j];
for(int i = 1;i<=n;i++)
for(int j = 1;j<=n;j++)
if(ok(i,j))//如果是陆地,那么就遍历这个岛
v = 1,ans+=dfs(i,j);
cout<<ans;
return 0;
}