编程训练————岛屿数量(C++)

2023-11-02

题目描述

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:
[
[‘1’,‘1’,‘1’,‘1’,‘0’],
[‘1’,‘1’,‘0’,‘1’,‘0’],
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘0’,‘0’,‘0’,‘0’,‘0’]
]
输出: 1

示例 2:

输入:
[
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘1’,‘1’,‘0’,‘0’,‘0’],
[‘0’,‘0’,‘1’,‘0’,‘0’],
[‘0’,‘0’,‘0’,‘1’,‘1’]
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-islands
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

主要思想

深度优先搜索

扫描网格,找到数字为‘1’的坐标,进行深度优先搜索,每一个被搜索到的1都更改为0,防止重复搜索,
深度搜索了多少次,那么就有多少个岛屿。

广度优先搜索

扫描网格,找到数字为‘1’的坐标,将其放入队列,进行广度优先搜索,每一个被搜索到的1都更改为0,队列为空的时候结束,广度搜索了多少次,那么就有多少个岛屿。

代码实现

摘自官网
https://leetcode-cn.com/problems/number-of-islands/solution/dao-yu-shu-liang-by-leetcode/

深度优先搜索

class Solution {
private:
    void dfs(vector<vector<char>>& grid, int r, int c) {
        int nr = grid.size();//网格的纵向长度
        int nc = grid[0].size();//网格横向长度

        grid[r][c] = '0';//将数值为1的坐标值改为0
        //判断此陆地垂直上方是否是陆地
        if (r - 1 >= 0 && grid[r-1][c] == '1') dfs(grid, r - 1, c);
        //判断此陆地垂直下方是否是陆地
        if (r + 1 < nr && grid[r+1][c] == '1') dfs(grid, r + 1, c);
        //判断此陆地左边是不是陆地
        if (c - 1 >= 0 && grid[r][c-1] == '1') dfs(grid, r, c - 1);
        //判断此陆地右边是不是陆地
        if (c + 1 < nc && grid[r][c+1] == '1') dfs(grid, r, c + 1);
    }

public:
    int numIslands(vector<vector<char>>& grid) {
        int nr = grid.size();
        if (!nr) return 0;
        int nc = grid[0].size();

        int num_islands = 0;
        for (int r = 0; r < nr; ++r) {
            for (int c = 0; c < nc; ++c) {
                if (grid[r][c] == '1') {
                    ++num_islands;//记录小岛总数量
                    dfs(grid, r, c);
                }
            }
        }

        return num_islands;
    }
};

广度优先搜索

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        int nr = grid.size();//网格纵向长度
        if (!nr) return 0;
        int nc = grid[0].size();//网格横向长度

        int num_islands = 0;//记录小岛总数
        //扫描网格
        for (int r = 0; r < nr; ++r) {
            for (int c = 0; c < nc; ++c) {
                if (grid[r][c] == '1') {
                    ++num_islands;
                    grid[r][c] = '0';
                    queue<pair<int, int>> neighbors;//创建队列
                    neighbors.push({r, c});//入队列
                    while (!neighbors.empty()) {
                        auto rc = neighbors.front();
                        neighbors.pop();
                        int row = rc.first, col = rc.second;//记录坐标
                        //开始判断此陆地上下左右是否也是陆地
                        if (row - 1 >= 0 && grid[row-1][col] == '1') {
                        //如果是陆地,那么入队列,然后将值改为0
                            neighbors.push({row-1, col});
                            grid[row-1][col] = '0';
                        }
                        if (row + 1 < nr && grid[row+1][col] == '1') {
                            neighbors.push({row+1, col});
                            grid[row+1][col] = '0';
                        }
                        if (col - 1 >= 0 && grid[row][col-1] == '1') {
                            neighbors.push({row, col-1});
                            grid[row][col-1] = '0';
                        }
                        if (col + 1 < nc && grid[row][col+1] == '1') {
                            neighbors.push({row, col+1});
                            grid[row][col+1] = '0';
                        }
                    }
                }
            }
        }

        return num_islands;
    }
};

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

编程训练————岛屿数量(C++) 的相关文章

随机推荐

  • 企业建设数字化工厂之前需要准备哪些硬件设施

    随着数字化技术的快速发展 数字化工厂已经成为了企业建设的重要方向 数字化工厂管理系统能够提高生产效率 降低成本 保证产品质量 为企业可持续发展提供有力支持 然而 建设数字化工厂需要准备一系列的硬件设施 以确保数字化工厂的正常运行 那么企业建
  • 关于文件上传漏洞的观点(upload-labs第九关)

    关于文件上传漏洞的观点 upload labs第九关 is upload false msg null if isset POST submit if file exists UPLOAD PATH deny ext array php p
  • java-web 过滤器 & 监听器 & 拦截器

    Tomcat 的容器分为四个等级 真正管理 Servlet 的容器是 Context 容器 一个 Context 对应一个 Web 工程 在 Tomcat 的配置文件中可以很容易发现这一点 如下 Context 配置参数
  • 有关校园网无法开启wifi的简单解决方法

    作为一个新时代的大学生 没有wifi的世界就是个噩梦 以前用的猎豹wifi 但发现卸载猎豹wifi后无法登陆校园网后 果断抛弃了这个家伙 现在使用的是一个叫360免费wifi的东西 现在开着校园网客户端的情况下打开360wifi 但是问题来
  • 如何用python远程探查每天的网页访问记录

    前言 利用Python制作远程查看别人电脑的操作记录 与其它教程类似 都是通过邮件返回 利用程序得到目标电脑浏览器当中的访问记录 生产一个文本并发送到你自己的邮箱 当然这个整个过程除了你把python程序植 入目标电脑外 其它的操作都是自动
  • nginx 报错[emerg]: unknown directive “锘? in E:\nginx-1.18.0/conf/nginx.conf:3

    报错 nginx 报错 emerg 32408 14080 unknown directive 锘 in E nginx 1 18 0 conf nginx conf 3 原因 使用nginx服务时 用txt记事本打开编辑了nginx co
  • 清除浮动的五种方法以及优缺点

    方法一 额外标签法 给谁清除浮动 就在其后额外添加一个空白标签 给其设置clear both 优点 通俗易懂 书写方便 缺点 添加许多无意义的标签 结构化比较差 clear both 本质就是闭合浮动 就是让父盒子闭合出口和入口 不让子盒子
  • Python实例:用Pandas处理表格(简单的增删改查)

    目录 任务描述 实现过程 任务描述 描述 现有一个excel表格 补充SCI模板 其中包括6个子表 中科院1区 表1 JCR Q1 表2 教研室补充 表 CCF A 表 CCF B 表 CCF C 表 每个表格第一列为期刊名称 需要为这些期
  • 基于springboot+vue的网上商城管理系统,附源码+数据库+lw文档+PPT,适合课程设计、毕业设计

    1 项目介绍 在Internet高速发展的今天 我们生活的各个领域都涉及到计算机的应用 其中包括网上图书商城的网络应用 在外国网上图书商城已经是很普遍的方式 不过国内的管理网站可能还处于起步阶段 网上图书商城具有网上图书信息管理功能的选择
  • Visual Studio在Release模式下开启debug调试,编译器提示变量已被优化掉,因而不可用

    系列文章目录 文章目录 系列文章目录 前言 一 解决办法 1 修改工程属性 参考 前言 我们在编写代码的时候 如果用到别人的库 而别人只提供了release版本 所有我们也只能生成release版本的工程 但是 我们又想调试代码 如果我们直
  • vue3 naiveui 自定义v-loading指令

    1 在sr目录下创建loading文件夹 包含index ts和index vue 2 index ts import render VNode createVNode from vue import Loading from index
  • 【Java基础知识 12】java枚举详解

    Java学习路线 搬砖工逆袭Java架构师 简介 Java领域优质创作者 CSDN哪吒公众号作者 Java架构师奋斗者 扫描主页左侧二维码 加入群聊 一起学习 一起进步 欢迎点赞 收藏 留言 目录 一 基本概念 二 枚举的优缺点 1 优点
  • focal loss的几种实现版本(Keras/Tensorflow)

    起源于在工作中使用focal loss遇到的一个bug 我仔细的学习多个靠谱的focal loss讲解及实现版本 通过测试 我发现了这样一个奇怪的现象 几乎每个版本的focal loss实现对同样的输入计算出的loss都是不同的 通过仔细的
  • 吃透Kafka底层通信机制后,我把系统网络性能提升了10倍以上!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 1 客户端与服务端的交互 2 频繁网络通信带来的性能低下问题 3 batch机制 多条消息打包成一个batch 4 request机制 多个batch打包成一个
  • 使用遗传算法解决旅行商问题

    遗传算法 Genetic Algorithm GA 最早是由美国的 John holland于20世纪70年代提出 该算法是根据大自然中生物体进化规律而设计提出的 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型 是一种
  • Install and Configure JRebel for MyEclipse

    http www zeroturnaround com jrebel using jrebel with myeclipse utm source jrebelDLpage utm medium idepluginlink utm camp
  • Zabbix 邮件告警

    一 登录邮箱 这里使用126邮箱 http mail 126 com 二 开启POP3的授权码 三 Zabbix服务器与邮箱服务器的连通性测试 root zabbix server nc smtp 126 com t 25 220 126
  • chatgpt赋能python:Python长度转换程序:方便快捷的单位转换工具

    Python长度转换程序 方便快捷的单位转换工具 如果你曾经需要将英寸转换为厘米 或是想知道你的身高在米制和英制中是多少 那么你一定知道这是一个烦人的任务 为了解决这个问题 我们创建了基于Python的长度转换程序 能够帮助你轻松转换任何单
  • wsl2安装及相关编程环境配置

    wsl2的安装及相关环境配置 1 设置 gt 更新和安全 gt 开发者选项 gt 开发人员模式 2 设置 gt 应用 gt 应用和功能 gt 程序和功能 gt 程序和功能 gt 启用或关闭windows功能 gt 适用于linux的wind
  • 编程训练————岛屿数量(C++)

    岛屿数量 题目描述 主要思想 深度优先搜索 广度优先搜索 代码实现 深度优先搜索 广度优先搜索 题目描述 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向或竖直方向上