数连通块
约 10 分钟
给一张地图,问有几片相连的陆地(连通块)。做法很直接:从头扫每个格子,遇到一块还没访问过的陆地,答案就加一,然后从它出发把整片相连的陆地全部标记掉,这样同一片不会被重复计数。
int cnt = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
if (grid[i][j] == 1 && !vis[i][j]) {
cnt++; // 发现新的一片
dfs(i, j); // 把这一整片全标记掉
}
dfs 里沿四个方向把相连的 1 都染成已访问。每个格子最多进出一次,总复杂度 。这个"发现一片、整片标记"的套路,叫洪水填充(Flood Fill)。
小纸条
为什么要把整片都标记?
登录 后可看答案