广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++递归算法处理岛屿问题详解
  • 645
分享到

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

2024-04-02 19:04:59 645人浏览 独家记忆
摘要

目录岛屿问题定义例题一-岛屿的数量例题二-岛屿的周长岛屿问题定义 岛屿问题是指用二维数组进行模拟, 1的位置表示陆地, 0的位置表示海洋。岛屿是指 被水(0)包围的陆地(1) 如下图

岛屿问题定义

岛屿问题是指用二维数组进行模拟, 1的位置表示陆地, 0的位置表示海洋。岛屿是指 被水(0)包围的陆地(1) 如下图所示:

岛屿问题是一道典型的递归问题(一位大佬曾说将岛屿问题看成是4叉树,我觉得这个比喻非常好), 对每个陆地位置, 我们需要递归地检测它的上下左右位置是不是陆地。

下面我们来写一下对岛屿问题的递归模板:

    public void dfs(char[][] grid, int m, int n){
    	// 位置越界 或者 该位置已经被遍历过
        if(isBeyond(grid, m, n) || grid[m][n] == 2){
            return;
        }
        // 相应操作
        ........
        // 记录已经遍历过位置
        grid[m][n] = '2';
		// 递归遍历该陆地位置的上下左右位置
        dfs(grid, m-1, n);
        dfs(grid, m+1, n);
        dfs(grid, m, n-1);
        dfs(grid, m, n+1);
    }
	// 检测越界的函数
    boolean isBeyond(char[][] grid, int m, int n){
        if(m < 0 || m>=grid.length || n<0 || n>=grid[0].length){
            return true;
        }
        return false;
    }

这里说明一下,岛屿问题中的备忘录问题,为什么在递归的过程中需要建立这样一个备忘录,我们可以看如下图解:

如果不建立备忘录,在递归过程中,可能会出现同一位置被多次递归调用的情况,这样增加了时间复杂度

备忘录实现方法 : 本题的备忘录实现非常简单, 只需将已经遍历过的位置的值修改为2即可

例题一-岛屿的数量

题目描述: 求一个二维数组中存在的岛屿数量

对本题我们直接调用上述模板即可

class Solution {
    public int numIslands(char[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int ans = 0;
        for(int i=0; i<m; i++){
            for(int j=0; j<n;j++){
                if(grid[i][j] == '1'){
                    // 递归过程中将属于同一岛屿的位置标记为2,保证属于同一岛屿的陆地1位置不会重复进入循环
                    dfs(grid, i, j); 
                    ans++;
                }
            }
        }
        return ans;
    }
    public void dfs(char[][] grid, int m, int n){
        if(isBeyond(grid, m, n)){
            return;
        }
        if(grid[m][n] != '1'){
            return;
        }
        grid[m][n] = '2';
        dfs(grid, m-1, n);
        dfs(grid, m+1, n);
        dfs(grid, m, n-1);
        dfs(grid, m, n+1);
    }
    boolean isBeyond(char[][] grid, int m, int n){
        if(m < 0 || m>=grid.length || n<0 || n>=grid[0].length){
            return true;
        }
        return false;
    }
}

例题二-岛屿的周长

ps:输入保证只有一个岛屿

分析:

我们可以分析每一个陆地元素,对结果的贡献度,如下图解,经过分析可得,当陆地与海洋接壤一次或者越界一次对岛屿总周长的贡献度+1

代码

class Solution {
    // 从一个陆地方块走向一个非陆地方块,就将岛屿面积加1
    public int islandPerimeter(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int perimeter = 0;
        for(int i=0; i<m; i++){
            for(int j=0; j<n; j++){
                if(grid[i][j] == 1){
                    // 因为只有一个岛屿,直接返回即可
                    return getPerimeter(grid, i, j);
                }
            }
        }
        return 0;
    }
    public int getPerimeter(int[][] grid, int m, int n){
        // 走到非陆地方块,返回共享度1
        if(isBeyond(grid, m, n) || grid[m][n] == 0){
            return 1;
        }
        // 走到遍历过方块返回0
        if(grid[m][n] == 2){
            return 0;
        }
        // 标记已经遍历过节点
        grid[m][n] = 2;
        return getPerimeter(grid, m-1, n)
        + getPerimeter(grid, m+1, n)
        + getPerimeter(grid, m, n-1)
        + getPerimeter(grid, m, n+1);
    }
    boolean isBeyond(int[][] grid, int m, int n){
        if(m < 0 || n < 0 || m >= grid.length || n >= grid[0].length){
            return true;
        }
        return false;
    }
}

到此这篇关于c++递归算法处理岛屿问题详解的文章就介绍到这了,更多相关C++岛屿问题内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++递归算法处理岛屿问题详解

本文链接: https://www.lsjlt.com/news/168896.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++递归算法处理岛屿问题详解
    目录岛屿问题定义例题一-岛屿的数量例题二-岛屿的周长岛屿问题定义 岛屿问题是指用二维数组进行模拟, 1的位置表示陆地, 0的位置表示海洋。岛屿是指 被水(0)包围的陆地(1) 如下图...
    99+
    2022-11-13
  • C# 递归算法详解
    目录1)1、1、2、3、5、8.......用递归算法求第30位数的值?2)编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)斐波那契数列为:0、1、1、2、3、……...
    99+
    2022-11-12
  • C#利用递归算法解决汉诺塔问题
    目录一、什么是递归二、汉诺塔问题1.汉诺塔的故事2.解决思路3.怎么解决汉诺塔问题4.具体代码实现三、完整代码一、什么是递归 方法调用自己的行为就是递归,递归必须要有终止条件,不然它...
    99+
    2022-11-13
  • C++递归与分治算法原理示例详解
    目录1. 汉诺塔问题2. 全排列问题3. 利用递归与分治策略寻找最大值4. 归并排序5. 快速排序6. 棋盘覆盖问题1. 汉诺塔问题   递归算法,分为 3 步:...
    99+
    2022-11-12
  • C#怎么利用递归算法解决汉诺塔问题
    本篇内容介绍了“C#怎么利用递归算法解决汉诺塔问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、什么是递归方法调用自己的行为就是递归,递...
    99+
    2023-06-30
  • 怎么理c语言解递归算法
    这篇文章主要讲解了“怎么理c语言解递归算法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理c语言解递归算法”吧!算法思路大家都知道,一个方法自己调用自己...
    99+
    2022-10-19
  • C语言超详细讲解递归算法汉诺塔
    目录题目描述画图分析思路总结代码实现总结题目描述 汉诺塔问题起源于一个传说 汉诺塔又被称为河内塔,传说,在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。 印度教...
    99+
    2022-11-13
  • C++实现二叉树非递归遍历算法详解
    目录一、二叉树的前序遍历二、二叉树的中序遍历三、二叉树的后序遍历3.1 方法一3.2 方法二一、二叉树的前序遍历 题目链接 我们可以把任何一棵树看成左路节点,左路节点和右子树。先访问...
    99+
    2023-05-17
    C++二叉树非递归遍历 C++非递归遍历 C++二叉树遍历
  • Java递归算法详解(动力节点整理)
    递归算法是一种直接或者间接调用自身函数或者方法的算法。Java递归算法是基于Java语言实现的递归算法。递归算法的实质是把问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。递归算法对解决一大类问题很有效,它可以使算法简洁...
    99+
    2023-05-31
    java 递归 ava
  • Java用递归方法解决汉诺塔问题详解
    目录前言一、问题描述二、问题分析三、解决方案四、示例前言 博主之前有写过关于递归问题的思维模式: 递归的思路 下面将用这种思维模式来求解经典汉诺塔问题。 一、问题描述 汉诺塔(又称河...
    99+
    2022-11-13
  • 如何进行C#递归算法理解的分析
    如何进行C#递归算法理解的分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。C#递归算法的理解并不是紧紧感觉很好用,那么C#递归算法的使用是要用递归的思路去解决...
    99+
    2023-06-17
  • PythonPSO算法处理TSP问题详解
    目录前言PSO算法算法流程简单实现解决TSP数据表示区别完整代码特点分析设计环境压力设计压力策略强化学习前言 先前我们给出了遗传算法的解决方案,那么同样的我们,给出使用PSO的解决方...
    99+
    2022-11-13
    Python PSO算法处理TSP Python PSO算法 Python TSP
  • C++贪心算法处理多机调度问题详解
    多机调度问题思路 1、把作业按加工所用的时间从大到小排序 2、如果作业数目比机器的数目少或相等,则直接把作业分配下去 3、 如果作业数目比机器的数目多,则每台机器上先分配一个作业,如...
    99+
    2022-11-13
  • 用C语言递归实现火车调度算法详解
    目录1、代码2、代码详解3、用二叉树表示调用过程4、思维导图笔者在李云清版的《数据结构》中第二章遇到了这道经典的火车调度题,经过对一些前辈的代码进行学习,以下将这段火车代码进行分析详...
    99+
    2022-11-12
  • Java基于递归解决全排列问题算法示例
    本文实例讲述了Java基于递归解决全排列问题算法。分享给大家供大家参考,具体如下:排列问题设R={r1,r2,...,rn}是要进行排列的n个元素,Ri=R-{ri}。集合x中元素的全排列记为Perm(X)。(ri)Perm(X)表示在全排...
    99+
    2023-05-30
    java 递归 全排列
  • Python 遗传算法处理TSP问题详解
    目录前言TSP问题枚举智能算法策略算法数据样例遗传算法算法流程繁殖交叉变异选择逆转代码TSP遗传算法种群表示交叉与变异代码运行结果总结前言 临时接到一个分支任务,那就是解决TSP问题...
    99+
    2022-11-13
    Python 遗传算法处理TSP Python 遗传算法 Python TSP
  • C语言递归函数与汉诺塔问题简明理解
    目录递归函数Hanio(汉诺塔)问题递归函数 直接或者间接调用函数本身。“自己调用自己” 什么情况下面可以使用递归呢 解决一个问题时,解决思路化成与问题本身类...
    99+
    2022-11-13
  • C#中如何使用迭代器和递归算法处理数据
    C#中如何使用迭代器和递归算法处理数据,需要具体代码示例在C#中,迭代器和递归算法是两种常用的数据处理方法。迭代器可以帮助我们遍历集合中的元素,而递归算法则能够有效地处理复杂的问题。本文将详细介绍如何使用迭代器和递归算法来处理数据,并提供具...
    99+
    2023-10-22
    数据处理 迭代器 递归算法
  • C/C++经典算法之约瑟夫问题详解
    目录什么是约瑟夫问题? 方法一:数组方法二:环形链表方法三:递归总结什么是约瑟夫问题?  约瑟夫问题:n个人围成一圈,初始编号从1~n排列,从约定编号为x的人开始...
    99+
    2022-11-12
  • C++中算法优化问题详细解析
    C++中算法优化问题详细解析引言:在编程领域中,算法的优化是一项非常重要的工作。一个高效的算法可以有效地节省时间和空间资源,提高程序的性能。C++作为一种高级编程语言,提供了丰富的工具和技术来优化算法。本文将详细解析C++中算法优化的问题,...
    99+
    2023-10-22
    C++ 算法优化 问题解析
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作