C++递归算法处理岛屿问题详解

C++递归算法处理岛屿问题详解

什么是岛屿问题?

岛屿问题是指在一个由字母 O 和 X 组成的二维矩阵中,连成一片的 O 组成的区域被称为一个岛屿。请编写一个 C++ 程序,计算出给定的矩阵中岛屿的数量。

解题思路

解题的基本思路是对每个位置进行深度优先搜索,将和当前位置连通的所有 O 都标记为已访问。如此定义岛屿的个数即为进行深度优先搜索的次数。

接下来让我们来详细分析算法实现:

1. 递归实现深度优先搜索

void dfs(vector<vector<char>>& grid, int i, int j){
    int m = grid.size(); //求出矩阵的行数
    int n = grid[0].size();  //求出矩阵的列数

    if(i < 0 || j < 0 || i >= m || j >= n || grid[i][j] != 'O') return;  //边界判断,如果当前位置越界,或者当前位置不为'O',则退出递归

    grid[i][j] = 'X';  //标记当前位置为已访问
    dfs(grid, i-1, j);  //上
    dfs(grid, i+1, j);  //下
    dfs(grid, i, j-1);  //左
    dfs(grid, i, j+1);  //右
}

2. 对每个位置进行深度优先搜索

int numIslands(vector<vector<char>>& grid) {
    int count = 0;  //初始化岛屿计数器
    for(int i = 0;i < grid.size();i++){
        for(int j = 0;j < grid[0].size();j++){
            if(grid[i][j] == 'O'){  //如果当前位置为'O',说明可能是岛屿的一部分
                count++;  //岛屿计数器加一
                dfs(grid, i, j);  //对当前位置进行深度优先搜索
            }
        }
    }
    return count;  //返回岛屿的个数
}

示例说明

示例1:

//输入:
[
  ['O', 'O', 'O', 'O', 'X'],
  ['O', 'O', 'X', 'O', 'O'],
  ['O', 'O', 'X', 'X', 'X'],
  ['X', 'X', 'O', 'O', 'X'],
]

//输出:
2

示例2:

//输入:
[
  ['O', 'O', 'O', 'O', 'X'],
  ['O', 'O', 'X', 'X', 'O'],
  ['O', 'O', 'X', 'X', 'X'],
  ['X', 'X', 'O', 'O', 'X'],
]

//输出:
1

以上就是本次分享的 C++ 递归算法处理岛屿问题的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++递归算法处理岛屿问题详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 浅析Java中Apache BeanUtils和Spring BeanUtils的用法

    浅析Java中Apache BeanUtils和Spring BeanUtils的用法 在Java中,BeanUtils是常用的一个实用工具类库,提供了对JavaBean属性的快速读写、类型转换等操作,而在Spring框架中,也有BeanUtils提供了一些符合Spring容器特性的扩展功能,下面将会对Apache BeanUtils和Spring Bean…

    Java 2023年5月19日
    00
  • 如何将默认的maven仓库改为阿里的maven仓库

    将默认的maven仓库改为阿里的maven仓库,需要在maven的settings.xml文件中进行配置。具体的步骤如下: 找到maven的settings.xml文件 在本地开发机上,maven的settings.xml文件一般位于maven安装目录的conf文件夹下。如果您使用的是IDEA等集成开发环境,则settings.xml文件可能位于IDEA安装…

    Java 2023年5月20日
    00
  • java 命名空间 命名规则

    Java命名空间是一种将类、变量、常量等命名方式组织起来的机制,以避免名字重复或冲突的问题。Java命名规则定义了变量和函数的命名应该遵循的规则和标准。 Java命名空间 Java中的命名空间是通过包名实现的。在Java中,每个类都必须被封装在一个包中,以避免与其他类的命名冲突。以下是Java命名空间的两个示例: 示例1:同一个包内的两个类名相同 // Fo…

    Java 2023年5月26日
    00
  • js实现窗口全屏示例详解

    首先,实现网页全屏有两种方式:一种是使用原生JavaScript,另一种是使用第三方库。 使用原生JavaScript实现窗口全屏 function fullscreen() { var elem = document.documentElement; if (elem.requestFullscreen) { elem.requestFullscreen(…

    Java 2023年5月23日
    00
  • 利用 Linq+Jquery+Ajax 实现异步分页功能可简化带宽压力

    利用 Linq+Jquery+Ajax 实现异步分页功能可简化带宽压力的攻略包括以下几个步骤: 1. 后端接口 首先需要在后端实现一个接口用于提供分页数据,可以使用 Linq 来实现。下面是一个 C# 的示例代码: public JsonResult GetList(int pageIndex, int pageSize) { var list = db.U…

    Java 2023年5月19日
    00
  • 解析SpringSecurity+JWT认证流程实现

    下面我将为大家详细讲解 “解析SpringSecurity+JWT认证流程实现” 的完整攻略。 1. JWT简介 JSON Web Token(JWT)是一种定义了一种紧凑且自包含的方式,可以用于将各种信息传递给另一个系统。JWT 在 Web 应用中得到广泛的应用,其最大的优势就是可以在客户端和服务器之间,通过方式方便快捷的的方式实现身份认证和授权。 JWT…

    Java 2023年5月20日
    00
  • Springboot通过配置WebMvcConfig处理Cors非同源访问跨域问题

    下面是详细的讲解。 什么是跨域? 跨域是指在浏览器的同源策略下,一个页面的脚本(包括JavaScript、Ajax等)访问另一个页面的数据时,出现了协议、域名或端口号不同的情况。如果不做任何处理,浏览器会阻止跨域请求,会产生“跨域问题”。 跨域解决方案 在前后端分离的项目中,开发人员经常会遇到跨域问题。解决跨域问题的方法很多,其中一种是使用CORS(跨域资源…

    Java 2023年5月23日
    00
  • Java设计模式之java装饰者模式详解

    Java设计模式之装饰者模式详解 什么是装饰者模式? 装饰者模式又叫包装模式,它是一种结构型设计模式。装饰者模式可以在运行时给对象动态添加一些额外的职责,而不影响该对象的行为。其实我们在生活中也经常使用到装饰者模式,比如将一个普通房间粉刷成卧室或客厅,这样就给房间添加了额外的功能,而且不会影响原有房间的结构和功能。 装饰者模式的角色和实现方式 装饰者模式有如…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部