NC109 岛屿数量

题目描述:

给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛。我们只考虑上下左右为相邻。
岛屿: 相邻陆地可以组成一个岛屿(相邻:上下左右) 判断岛屿个数。

解题分析:

使用dfs遍历即可。

class Solution {
public:
    /**
     * 判断岛屿数量
     * @param grid char字符型vector<vector<>> 
     * @return int整型
     */
    int solve(vector<vector<char> >& grid) {
        // write code here
        int ans=0;
        for(int i=0; i<grid.size(); ++i){
            for(int j=0; j<grid[0].size(); ++j){
                if(grid[i][j]=='1'){
                    ans++;
                    solveRecursive(grid, i, j);
                }
            }
        }
        return ans;
    }
    void solveRecursive(vector<vector<char>>& grid, int x, int y){
        if(x>=grid.size() || y>=grid[0].size() || grid[x][y]=='0'){
            return;
        }
        grid[x][y]='0';
        solveRecursive(grid, x,y-1);
        solveRecursive(grid, x,y+1);
        solveRecursive(grid, x-1,y);
        solveRecursive(grid, x+1,y);
        return;
    }
    
};
### 岛屿数量算法题解 #### 问题描述 给定一个由字符 `'1'`(陆地)和 `'0'`(水域)组成的二维网格 `grid`,目标是计算其中岛屿数量岛屿是指通过水平或垂直方向相连的一片陆地,并且四周都被水包围。 --- #### 方法概述 该问题可以通过 **深度优先搜索 (DFS)** 或 **广度优先搜索 (BFS)** 来解决。以下是两种方法的具体实现: --- #### 深度优先搜索 (DFS) DFS 是一种常用的遍历方式,在处理连通分量类问题时非常有效。其核心思想是从某个起点出发,沿着路径尽可能深入访问节点,直到无法继续为止。 ##### 实现步骤 1. 定义一个辅助函数用于执行 DFS。 2. 遍历整个网格,当遇到未访问过的陆地 (`'1'`) 时,启动一次新的 DFS 过程。 3. 在每次 DFS 调用中,标记当前单元格为已访问,并递归调用相邻的四个方向上的单元格。 4. 计数器记录每完成一次完整的 DFS 所对应的独立岛屿数目。 ##### Python 实现代码 ```python def numIslands(grid): if not grid: return 0 rows, cols = len(grid), len(grid[0]) visited = [[False for _ in range(cols)] for _ in range(rows)] def dfs(r, c): if r < 0 or c < 0 or r >= rows or c >= cols: return if grid[r][c] == '0' or visited[r][c]: return visited[r][c] = True directions = [(r-1,c),(r+1,c),(r,c-1),(r,c+1)] for dr, dc in directions: dfs(dr, dc) count = 0 for i in range(rows): for j in range(cols): if grid[i][j] == '1' and not visited[i][j]: dfs(i, j) count += 1 return count ``` 上述代码实现了基于 DFS 的解决方案[^1]。 --- #### 广度优先搜索 (BFS) BFS 则是一种逐层扩展的方式,适合于寻找最短路径或者在层次化结构中的应用。对于岛屿计数问题,它同样可以很好地解决问题。 ##### 实现步骤 1. 使用队列存储待访问的坐标点。 2. 当发现一个新的陆地点时,将其加入队列并开始 BFS。 3. 对队列中的每一个点,依次检查它的上下左右邻居是否也是陆地,如果是,则加入队列并标记为已访问。 4. 继续这一过程直至队列为空,表示完成了对该岛的完全扫描。 ##### Python 实现代码 ```python from collections import deque def numIslands_bfs(grid): if not grid: return 0 rows, cols = len(grid), len(grid[0]) visited = [[False for _ in range(cols)] for _ in range(rows)] queue = deque() count = 0 def bfs(r, c): queue.append((r, c)) while queue: row, col = queue.popleft() if row < 0 or col < 0 or row >= rows or col >= cols: continue if grid[row][col] == '0' or visited[row][col]: continue visited[row][col] = True neighbors = [(row-1,col),(row+1,col),(row,col-1),(row,col+1)] for nr, nc in neighbors: queue.append((nr, nc)) for i in range(rows): for j in range(cols): if grid[i][j] == '1' and not visited[i][j]: bfs(i, j) count += 1 return count ``` 这段代码展示了如何利用 BFS 来求解岛屿数量[^2]。 --- #### Flood Fill 算法的应用 Flood Fill 算法本质上也是一种填充技术,通常用来改变图像中某一区域的颜色或其他属性。在此场景下,它可以被看作是对岛屿进行“淹没”的操作——即将一片连续的陆地标记为已经访问过的形式。这种方法特别适用于需要多次修改状态的情况[^3]。 --- #### 数据结构的选择 为了提高效率以及简化逻辑表达,推荐使用 Python 提供的标准库来管理数据结构。例如: - `list` 可作为简单的栈实现; - `collections.deque` 不仅支持高效的两端插入删除操作,还兼具了栈与队列的功能特性[^4]。 --- #### 总结 无论是采用 DFS 还是 BFS 方式,最终都能有效地统计出地图上存在的岛屿总数。具体选用哪种取决于个人偏好或是特定应用场景下的需求考量因素。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值