编程训练————岛屿数量(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++) 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

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

    随着数字化技术的快速发展 数字化工厂已经成为了企业建设的重要方向 数字化工厂管理系统能够提高生产效率 降低成本 保证产品质量 为企业可持续发展提供有力支持 然而 建设数字化工厂需要准备一系列的硬件设施 以确保数字化工厂的正常运行 那么企业建
  • 关于文件上传漏洞的观点(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 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向或竖直方向上