数连通块

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)。

小纸条

为什么要把整片都标记?

登录 后可看答案

数连通块 · 考级冲刺 · op599 课程