遇到未访问陆地就 DFS 淹没整块,计数加一。
OJ: leetcodecn
题目 ID: number-of-islands
难度:普及+/提高
标签:DFSBFS网格cpppython
日期: 2026-07-29 13:10
题意
网格中 ‘1’ 为陆地,找连通块数量。
思路
扫描网格,遇到 ‘1’ 就 DFS/BFS 将整块淹没并计数。
代码
cpp
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int numIslands(vector<vector<char>> &grid) {
int m = grid.size(), n = grid[0].size(), ans = 0;
function<void(int, int)> dfs = [&](int i, int j) {
if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == '0')
return;
// 原地改成水,既标记访问状态,也避免同一陆地被重复搜索。
grid[i][j] = '0';
dfs(i - 1, j);
dfs(i + 1, j);
dfs(i, j - 1);
dfs(i, j + 1);
};
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (grid[i][j] == '1') {
ans++;
dfs(i, j);
}
return ans;
}
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int m, n;
cin >> m >> n;
vector<vector<char>> g(m, vector<char>(n));
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
cin >> g[i][j];
cout << Solution().numIslands(g) << '\n';
return 0;
}python
#!/usr/bin/env python3
from typing import List
class Solution:
def numIslands(self, grid: List[List[str]]) -> int:
m, n = len(grid), len(grid[0])
def dfs(i, j):
if i < 0 or i >= m or j < 0 or j >= n or grid[i][j] == "0":
return
grid[i][j] = "0"
for di, dj in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
dfs(i + di, j + dj)
ans = 0
for i in range(m):
for j in range(n):
if grid[i][j] == "1":
ans += 1
dfs(i, j)
return ans
def main():
m, n = map(int, input().split())
g = [input().split() for _ in range(m)]
print(Solution().numIslands(g))
if __name__ == "__main__":
main()复杂度
时间 O(mn),空间 O(mn) 递归栈。
总结
淹没法是连通块计数的标准 DFS 做法。