欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

島嶼問題定義

島嶼問題是指用二維數組進行模擬, 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位置不會重復進入循環(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:輸入保證只有一個島嶼

分析:

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

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

相關文章

  • C語言循環(huán)隊列與用隊列實現棧問題解析

    C語言循環(huán)隊列與用隊列實現棧問題解析

    循環(huán)隊列又叫環(huán)形隊列,是一種特殊的隊列。循環(huán)隊列解決了隊列出隊時需要將所有數據前移一位的問題,本篇帶你一起看看循環(huán)隊列的問題和怎樣用隊列實現棧
    2022-04-04
  • C語言查找數組里數字重復次數的方法

    C語言查找數組里數字重復次數的方法

    這篇文章主要介紹了C語言查找數組里數字重復次數的方法,涉及C語言針對數組的遍歷與判斷技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C語言實現數組的循環(huán)左移,右移,翻轉的示例

    C語言實現數組的循環(huán)左移,右移,翻轉的示例

    今天小編就為大家分享一篇C語言實現數組的循環(huán)左移,右移,翻轉的示例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • tinyxml 常用的C++ XML解析器非常優(yōu)秀

    tinyxml 常用的C++ XML解析器非常優(yōu)秀

    讀取和設置xml配置文件是最常用的操作,試用了幾個C++的XML解析器,個人感覺TinyXML是使用起來最舒服的,因為它的API接口和Java的十分類似,面向對象性很好
    2012-11-11
  • C++前綴樹字典樹的學習與模擬實現代碼示例

    C++前綴樹字典樹的學習與模擬實現代碼示例

    這篇文章主要介紹了C++前綴樹字典樹的學習與模擬實現代碼示例,Trie又被稱為前綴樹、字典樹,所以當然是一棵樹,上面這棵Trie樹包含的字符串集合是{in,inn,int,tea,ten,to},每個節(jié)點的編號是我們?yōu)榱嗣枋龇奖慵由先サ?需要的朋友可以參考下
    2023-07-07
  • C語言責任鏈模式示例代碼

    C語言責任鏈模式示例代碼

    大家好,本篇文章主要講的是C語言責任鏈模式示例代碼,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • 使用C++實現位圖處理

    使用C++實現位圖處理

    本文介紹了如何使用C++語言處理位圖圖像,包括讀取、修改、保存等操作。通過具體的代碼示例,讀者可以學習到如何利用C++中的位運算、數組和文件操作等知識點完成位圖處理任務。同時,本文也提供了一些常用的圖像處理算法供讀者參考,幫助讀者更好地理解位圖處理過程
    2023-04-04
  • VS未找到框架“.NETFramework,Version=v4.6.1”引用程序集的解決辦法

    VS未找到框架“.NETFramework,Version=v4.6.1”引用程序集的解決辦法

    本文主要介紹了VS未找到框架“.NETFramework,Version=v4.6.1”引用程序集的解決辦法,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Visual?Studio?2022使用MinGW來編譯調試C/C++程序的圖文教程

    Visual?Studio?2022使用MinGW來編譯調試C/C++程序的圖文教程

    這篇文章主要介紹了Visual?Studio?2022使用MinGW來編譯調試C/C++程序,以實例來簡單介紹一下VS2022中如何使用MinGW來編譯、調試C/C++程序,需要的朋友可以參考下
    2022-08-08
  • c++讀寫文件流實例程序講解

    c++讀寫文件流實例程序講解

    這篇文章主要介紹了c++讀寫文件流實例,大家參考使用吧
    2013-12-12

最新評論