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 泛型总结(二):泛型与数组

    Java 泛型总结(二):泛型与数组 在 Java 中,泛型和数组是两个不同的概念,但它们之间的关系比较微妙,需要仔细理解。本篇文章将讲解 Java 泛型和数组的关系,旨在帮助读者更深入理解 Java 泛型的本质。 泛型与数组的不同 泛型是编译期检查的,而数组是运行期检查的。这意味着,我们可以编写泛型代码来确保模板类型的安全性,一旦编译通过,就可以放心使用。…

    Java 2023年5月26日
    00
  • JAVA实现 springMVC方式的微信接入、实现消息自动回复实例

    微信公众号开发是一个非常热门的领域,而 SpringMVC 是一个非常流行的 Java Web 框架。本文将详细讲解如何使用 SpringMVC 框架实现微信公众号接入和消息自动回复功能,包括如何配置微信公众号、如何处理微信公众号的请求、如何实现消息自动回复等。 配置微信公众号 在开始之前,我们需要先配置微信公众号。下面是一个简单的示例,演示了如何配置微信公…

    Java 2023年5月18日
    00
  • Java web过滤器验证登录防止未登录进入界面

    Java web过滤器可以用来实现登录验证,防止未登录用户进入系统内部页面,增强系统的安全性。下面是一个完整的攻略。 1.设计登录页面 首先需要设计一个用户登录的页面。用户在页面中输入用户名和密码。 2.实现用户验证 在Java web中,可以通过session来保存用户的信息。用户在登录后,将用户名和密码存储在session中。 3.编写过滤器 编写一个过…

    Java 2023年6月15日
    00
  • 重新认识Java的System.in

    重新认识Java的System.in Java中的System.in是标准输入流,常用于从用户的输入中读取数据。在本文中,我们将详细介绍如何正确使用System.in。 1. 读取用户输入的整数 读取用户输入的整数有两种方法,分别是使用Scanner类和BufferedReader类。 1.1 使用Scanner类 Scanner类是一个方便的类,可以帮助我…

    Java 2023年6月15日
    00
  • Spring.Net在MVC中实现注入的原理解析

    下面是关于“Spring.Net在MVC中实现注入的原理解析”的完整攻略,包含两个示例说明。 Spring.Net在MVC中实现注入的原理解析 在MVC应用程序中,依赖注入(DI)是一种重要的设计模式,可以大大简化应用程序的开发和维护。本文将介绍如何使用Spring.Net实现依赖注入。 依赖注入 1. 添加依赖 首先,我们需要添加以下依赖: <dep…

    Java 2023年5月17日
    00
  • SpringBoot与SpringMVC中参数传递的原理解析

    在SpringBoot和SpringMVC中,参数传递是Web开发中的重要部分。本文将详细讲解SpringBoot和SpringMVC中参数传递的原理解析,并提供两个示例说明。 SpringBoot中参数传递 在SpringBoot中,我们可以使用@RequestParam注解来获取请求参数。下面是一个示例: @GetMapping("/user&…

    Java 2023年5月18日
    00
  • 关于Maven的使用,这些你都真的了解么

    关于Maven的使用,这些你都真的了解么 什么是Maven? Maven是一个基于项目对象模型(POM),可以通过一小段描述文件来管理项目构建、依赖管理和文档编制等的工具。它可以帮助开发者快速构建Java项目。 Maven的安装 要使用Maven,需要先安装Maven。 以下是在Windows操作系统上安装Maven的方法: 去 Maven官网 下载Mave…

    Java 2023年5月20日
    00
  • SpringBoot JSON全局日期格式转换器实现方式

    下面是 SpringBoot JSON 全局日期格式转换器实现方式的攻略: 1. 需求分析 在 SpringBoot 应用中,Java 中的 Date 类型会默认转换为 Unix 时间戳格式,在通过 API 接口返回给前端时,需要对 Date 类型进行格式化。我们可以定义全局的 JSON 转换器来实现日期格式转换。 2. 实现方式 2.1 自定义日期格式化工…

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