最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++遞歸算法處理島嶼問題詳解

 更新時間:2022年10月08日 09:56:14   作者:劉婉晴  
這篇文章主要介紹了用遞歸算法解決島嶼問題的流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧

島嶼問題定義

島嶼問題是指用二維數(shù)組進行模擬, 1的位置表示陸地, 0的位置表示海洋。島嶼是指 被水(0)包圍的陸地(1) 如下圖所示:

島嶼問題是一道典型的遞歸問題(一位大佬曾說將島嶼問題看成是4叉樹,我覺得這個比喻非常好), 對每個陸地位置, 我們需要遞歸地檢測它的上下左右位置是不是陸地。

下面我們來寫一下對島嶼問題的遞歸模板:

    public void dfs(char[][] grid, int m, int n){
    	// 位置越界 或者 該位置已經(jīng)被遍歷過
        if(isBeyond(grid, m, n) || grid[m][n] == 2){
            return;
        }
        // 相應(yīng)操作
        ........
        // 記錄已經(jīng)遍歷過位置
        grid[m][n] = '2';
		// 遞歸遍歷該陸地位置的上下左右位置
        dfs(grid, m-1, n);
        dfs(grid, m+1, n);
        dfs(grid, m, n-1);
        dfs(grid, m, n+1);
    }
	// 檢測越界的函數(shù)
    boolean isBeyond(char[][] grid, int m, int n){
        if(m < 0 || m>=grid.length || n<0 || n>=grid[0].length){
            return true;
        }
        return false;
    }

這里說明一下,島嶼問題中的備忘錄問題,為什么在遞歸的過程中需要建立這樣一個備忘錄,我們可以看如下圖解:

如果不建立備忘錄,在遞歸過程中,可能會出現(xiàn)同一位置被多次遞歸調(diào)用的情況,這樣增加了時間復(fù)雜度

備忘錄實現(xiàn)方法 : 本題的備忘錄實現(xiàn)非常簡單, 只需將已經(jīng)遍歷過的位置的值修改為2即可

例題一-島嶼的數(shù)量

題目描述: 求一個二維數(shù)組中存在的島嶼數(shù)量

對本題我們直接調(diào)用上述模板即可

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'){
                    // 遞歸過程中將屬于同一島嶼的位置標(biāo)記為2,保證屬于同一島嶼的陸地1位置不會重復(fù)進入循環(huán)
                    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:輸入保證只有一個島嶼

分析:

我們可以分析每一個陸地元素,對結(jié)果的貢獻度,如下圖解,經(jīng)過分析可得,當(dāng)陸地與海洋接壤一次或者越界一次對島嶼總周長的貢獻度+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;
        }
        // 標(biāo)記已經(jīng)遍歷過節(jié)點
        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;
    }
}

到此這篇關(guān)于C++遞歸算法處理島嶼問題詳解的文章就介紹到這了,更多相關(guān)C++島嶼問題內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言中fopen()函數(shù)的使用方法示例詳解

    C語言中fopen()函數(shù)的使用方法示例詳解

    這篇文章主要介紹了C語言中fopen()函數(shù)的使用方法,本文結(jié)合實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • C語言循環(huán)隊列的表示與實現(xiàn)實例詳解

    C語言循環(huán)隊列的表示與實現(xiàn)實例詳解

    這篇文章主要介紹了C語言循環(huán)隊列的表示與實現(xiàn),對于數(shù)據(jù)結(jié)構(gòu)與算法的研究很有幫助,需要的朋友可以參考下
    2014-07-07
  • 二維指針動態(tài)分配內(nèi)存連續(xù)問題深入分析

    二維指針動態(tài)分配內(nèi)存連續(xù)問題深入分析

    當(dāng)我們定義一個二維指針時,如果需要存儲相應(yīng)的數(shù)據(jù),就需要我們動態(tài)的分配內(nèi)存,這時,有一點是需要注意的,分配內(nèi)存的方法不同,內(nèi)存的連續(xù)性也是不相同的
    2013-07-07
  • VC++ 獲取系統(tǒng)時間的方法匯總

    VC++ 獲取系統(tǒng)時間的方法匯總

    本文給大家匯總介紹了5種VC++中獲取系統(tǒng)時間的方法,十分的簡單實用,有需要的小伙伴可以參考下。
    2015-07-07
  • Qt地圖自適應(yīng)拉伸的實現(xiàn)示例

    Qt地圖自適應(yīng)拉伸的實現(xiàn)示例

    最近需要寫一個程序,要是讓qt到程序自適應(yīng),本文主要介紹了Qt地圖自適應(yīng)拉伸的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符

    C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符

    這篇文章主要介紹了C語言選擇、循環(huán)、函數(shù)、數(shù)組與操作符,文章基于C語言展開對主題的詳細介紹,下文內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • C++17使用折疊表達式實現(xiàn)一個IsAllTrue函數(shù)的過程

    C++17使用折疊表達式實現(xiàn)一個IsAllTrue函數(shù)的過程

    本文介紹了利用C++17特性實現(xiàn)IsAllTrue函數(shù)的方法,詳細講解了從基于初始化列表的初級版本到使用折疊表達式和類型萃取的高級優(yōu)化版本,需要的朋友參考下吧
    2024-09-09
  • C++棧(stack)的模板類實現(xiàn)代碼

    C++棧(stack)的模板類實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了C++棧(stack)的模板類實現(xiàn)代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • C++基礎(chǔ)入門之運算符

    C++基礎(chǔ)入門之運算符

    下面小編就為大家?guī)硪黄P(guān)于C++運算符基礎(chǔ)的文章。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11
  • C語言中scanf與scnaf_s函數(shù)詳解

    C語言中scanf與scnaf_s函數(shù)詳解

    大家好,本篇文章主要講的是C語言中scanf與scnaf_s函數(shù)詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01

最新評論

老河口市| 定安县| 渑池县| 囊谦县| 安徽省| 兴业县| 论坛| 崇阳县| 南京市| 大埔县| 皮山县| 河北区| 锦州市| 霍林郭勒市| 双江| 临城县| 含山县| 五河县| 天水市| 丹凤县| 都江堰市| 稻城县| 长寿区| 泗水县| 怀宁县| 静海县| 衡水市| 渭源县| 炉霍县| 天峨县| 农安县| 太保市| 仙桃市| 阿克陶县| 梁河县| 新安县| 沈阳市| 白水县| 南召县| 贵州省| 青海省|