题目描述
题目分析
果然有关连通块类的问题使用dfs都较为好写~~
我们可以通过判断连通块的代码来加上部分条件算出被完全淹没的岛屿个数
在岛屿中如果有为"#"的a[i][j]上下左右全部是"#"则说明此岛屿一定不会被完全淹没,但如果此连通块全部被遍历后发现没有这种情况则这个岛屿一定会被完全淹没,这时我们才看做它是真正我们要求的连通块,我们将其算入答案
cpp
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
const int N = 2e3 + 10;
int n, cnt, ans;
char a[N][N];
bool st[N][N];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
void dfs(int x, int y)
{
st[x][y] = 1;
int o = 0;
for(int i = 0; i < 4; i ++)
{
int aa = x + dx[i];
int bb = y + dy[i];
if(a[aa][bb] == '#')o ++;
}
if(o == 4)cnt ++;
for(int i = 0; i < 4; i ++)
{
int aa = x + dx[i];
int bb = y + dy[i];
if(a[aa][bb] == '#' && !st[aa][bb])dfs(aa, bb);
}
}
int 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(!st[i][j] && a[i][j] == '#')
{
cnt = 0;
dfs(i, j);
if(cnt == 0)ans ++;
}
}
}
cout << ans;
return 0;
}