funcnumIslands(grid [][]byte)int { // 或者数组大小 n, m := len(grid), len(grid[0]) // 初始化方向数组 dx, dy = []int{-1, 0, 0, 1}, []int{0, -1, 1, 0} res := 0 // 依次枚举,寻找为 1 的位置 for i := 0; i < n; i++ { for j := 0; j < m; j++ { if grid[i][j] == '1' { // 对于每个 1 的位置,表示有一个岛屿 res++ // 找到所有这个岛屿的陆地,将其都置为 0,避免后续重复搜索 dfs(grid, i, j, n, m) } } } return res }
var dx, dy []int
funcdfs(g [][]byte, x, y, n, m int) { g[x][y] = '0' // 通过枚举方向数组来实现枚举周围 4 个方向 for i := 0; i < 4; i++ { // a, b 为下一个位置,周围的某个位置 a, b := x + dx[i], y + dy[i] // 如果搜索到数组的边界外,则跳过 if a < 0 || b < 0 || a >= n || b >= m { continue } // 如果搜索到 0 的话,则跳过,必须相邻的陆地,也就是 1 if g[a][b] == '0' { continue } // DFS,继续搜索下一个位置 dfs(g, a, b, n, m) } }
voiddfs(vector<vector<char>>& g, int x, int y, int n, int m){ g[x][y] = '0'; for (int i = 0; i < 4; ++i) { int a = x + dx[i], b = y + dy[i]; if (a < 0 || b < 0 || a >= n || b >= m) continue; if (g[a][b] == '0') continue; dfs(g, a, b, n, m); } }
intnumIslands(vector<vector<char>>& grid){ int n = grid.size(), m = grid[0].size(); int res = 0; for (int i = 0; i < n; ++i) { for (int j = 0; j < m; ++j) { if (grid[i][j] == '1') { ++res; dfs(grid, i, j, n, m); } } } return res; } };