题意是求一共淹没几个岛,不是求剩下几个岛(这个更复杂一些,可能会出现岛屿增加的情况),用bfs+flood fill做
#include<iostream>
#include<queue>
using namespace std;
const int N = 1010;
#define PII pair<int, int>
#define x first
#define y second
char g[N][N];
int st[N][N];
int n;
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
int bfs(int x, int y){
queue<PII> q;
q.push({x, y});
int ans = 0;
while(q.size()){
auto h = q.front();
int x = h.x, y = h.y;
q.pop();
ans ++;
int d = 0;
for(int i = 0; i < 4; i ++){
int a = x + dx[i], b = y + dy[i];
if(a < 0 || a >= n || b < 0 || b >= n || st[a][b]) continue;
if(g[a][b] == '.'){
d = 1;
continue;
}
st[a][b] = 1;
q.push({a, b});
}
if(d) ans --;
}
return ans;
}
int main(){
cin >> n;
for(int i = 0; i < n; i ++) cin >> g[i];
int res = 0;
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
if(g[i][j] == '#' && st[i][j] == 0){
st[i][j] = 1;
res ++;
if(bfs(i, j)) res --;
}
cout << res;
return 0;
}