#include<bits/stdc++.h>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 1e3 + 9;
int n ;
char g[N][N];
bool st[N][N];
PII q[N * N];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
void bfs(int sx, int sy, int &total, int &bound)
{
int hh = 0, tt = 0;
q[0] = {sx, sy};
st[sx][sy] = true;
while(hh <= tt) // 当队列不空的时候
{
PII t = q[hh ++];
total ++ ;
bool is_bound = false;
for(int i = 0; i < 4; i ++)
{
int x = t.x + dx[i], y = t.y + dy[i];
if(x < 0 || x >= n || y < 0 || y >= n) continue;
if(st[x][y]) continue; //已经被遍历过需要跳过
if(g[x][y] == '.')// 如果是海洋的话也要进行跳过
{
is_bound = true;
continue;
}
q[ ++ tt] = {x, y};
st[x][y] = true ;
}
if(is_bound) bound ++ ;
}
}
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i ++) scanf("%s", g[i]);
int cnt = 0;
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
if(!st[i][j] && g[i][j] == '#') //如果当前位置没有被遍历过且当前位置是陆地
{
int total = 0, bound = 0;
bfs(i, j, total, bound);
if(total == bound) cnt ++ ;
}
// total 表示岛屿的数量
// bound 表示海洋的地方
printf("%d\n", cnt );
return 0;
}
淹没的岛屿 bfs
最新推荐文章于 2025-07-04 15:03:44 发布