作文以记之 ~ 岛屿数量

0、前言

本篇博客是力扣上 200. 岛屿数量 题的一篇题解,写下这篇博客主要是想通过这个题的题解来记录在练习 广度优先搜索算法(Breadth-First-Search,缩写为 BFS)深度优先搜索算法(Depth-First-Search,缩写为 DFS) 两种算法的代码应用!

如果上手此篇博客中的题目有点困难,可点击查看博客 作文以记之 ~ 图像渲染 ,此博客中的题是本篇博客中题的基础,可先练习简单的,再上手这个题!

GitHub 相关内容可 点击此处 进行查看!

1、简单说明

广度优先搜索算法(BFS),是一种 利用队列 实现的搜索算法。
深度优先搜索算法(DFS),是一种 利用递归 实现的搜索算法。

BFS 的重点在于队列,而 DFS 的重点在于递归。这是它们的本质区别。
有个小点是,能用dfs解决的题,一般就不能用bfs解决;能用bfs解决的题,一般就不能用dfs。(相关内容可点击 dfs bfs算法区别 此博客进行查看!)

两种算法的具体说明可点击 图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS) 此文章进行查看!

2、题目描述

在这里插入图片描述

3、解题思路

3.1 方法1 ~ 使用DFS

3.1.1 思路

为了求出岛屿的数量,可以扫描整个二维网格。从(0,0)位置开始,如果目标位置为 '1',则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,需将每个搜索到的 '1' 都会被标记为 '0' ,避免出现多次干扰。

最终岛屿的数量就是我们进行深度优先搜索的次数。

3.1.2 程序代码

class Solution {
public:
    void dfs(vector<vector<char>>& grid, int row,int col)
    {
        int rowmax = grid.size();
        int colmax = grid[0].size();
        //将为 '1' 的元素设为 '0',避免出现干扰
        grid[row][col] = '0';
        // 检查根节点或者目标位置的数据周围为 ‘1’ 的位置
        if((row - 1) >= 0 && grid[row-1][col] == '1') dfs(grid,row-1,col);
        if((row + 1) < rowmax && grid[row+1][col] == '1') dfs(grid,row+1,col);
        if((col - 1) >= 0 && grid[row][col-1] == '1') dfs(grid,row,col-1);
        if((col + 1) < colmax && grid[row][col+1] == '1') dfs(grid,row,col+1);
    }
    int numIslands(vector<vector<char>>& grid) {
        int rowmax = grid.size();
        if(rowmax <= 0) return 0;
        int colmax = grid[0].size();
        int num = 0;
        for(int row = 0; row < rowmax; row++)
        {
            for(int col = 0; col < colmax; col++)
            {
                if(grid[row][col] == '1')
                {
                    num++;
                    dfs(grid,row,col);
                } 
            }
        }
        return num;
    }
};

3.2 方法2 ~ 利用BFS

3.2.1 思路

为了求出岛屿的数量,需扫描整个二维网格。如果一个位置为 ‘1’,则将其加入队列,开始进行广度优先搜索。在广度优先搜索的过程中,每个搜索到的 ‘1’ 都会被重新标记为 ‘0’

期间会进行 出队入队 操作,出队是将出队的点作为起始点进行搜索操作,入队是当找到满足要求的点后将其存入队列,方便后续做搜索操作!直到队列为空,搜索结束。

最终岛屿的数量就是进行广度优先搜索的次数。

3.2.2 程序代码

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        int rowmax = grid.size();
        if(rowmax <= 0) return 0;
        int colmax = grid[0].size();
        int num = 0;
        queue<pair<int,int>> obj;

        for(int r = 0; r < rowmax; r++)
        {
            for(int c = 0; c < colmax; c++)
            {
                if(grid[r][c] == '1')
                {
                    num++;
                    grid[r][c] = '0';
                    obj.push({r,c});
                    while(!obj.empty())
                    {
                    	//做出队操作,将出队的点作为起始点进行搜索
                        auto rc = obj.front();
                        obj.pop();
                        int row = rc.first, col = rc.second;
                        if((row - 1) >= 0 && grid[row-1][col] == '1')
                        {
                            grid[row-1][col] = '0';
                            obj.push({row-1,col});
                        }
                        if((row + 1) < rowmax && grid[row+1][col] == '1')
                        {
                            grid[row+1][col] = '0';
                            obj.push({row+1,col});
                        }
                        if((col - 1) >= 0 && grid[row][col-1] == '1')
                        {
                            grid[row][col-1] = '0';
                            obj.push({row,col-1});
                        }
                        if((col + 1) < colmax && grid[row][col+1] == '1')
                        {
                            grid[row][col+1] = '0';
                            obj.push({row,col+1});
                        }
                    }
                }
            }
        }
        return num;
    }
};

:以上内容大多数来自于 力扣官方题解 ,有需要者可点击查看!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值