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

C++遞歸算法處理島嶼問(wèn)題詳解

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

島嶼問(wèn)題定義

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

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

下面我們來(lái)寫(xiě)一下對(duì)島嶼問(wèn)題的遞歸模板:

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

這里說(shuō)明一下,島嶼問(wèn)題中的備忘錄問(wèn)題,為什么在遞歸的過(guò)程中需要建立這樣一個(gè)備忘錄,我們可以看如下圖解:

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

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

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

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

對(duì)本題我們直接調(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'){
                    // 遞歸過(guò)程中將屬于同一島嶼的位置標(biāo)記為2,保證屬于同一島嶼的陸地1位置不會(huì)重復(fù)進(jìn)入循環(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;
    }
}

例題二-島嶼的周長(zhǎng)

ps:輸入保證只有一個(gè)島嶼

分析:

我們可以分析每一個(gè)陸地元素,對(duì)結(jié)果的貢獻(xiàn)度,如下圖解,經(jīng)過(guò)分析可得,當(dāng)陸地與海洋接壤一次或者越界一次對(duì)島嶼總周長(zhǎng)的貢獻(xiàn)度+1

代碼

class Solution {
    // 從一個(gè)陸地方塊走向一個(gè)非陸地方塊,就將島嶼面積加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){
                    // 因?yàn)橹挥幸粋€(gè)島嶼,直接返回即可
                    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;
        }
        // 走到遍歷過(guò)方塊返回0
        if(grid[m][n] == 2){
            return 0;
        }
        // 標(biāo)記已經(jīng)遍歷過(guò)節(jié)點(diǎn)
        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++遞歸算法處理島嶼問(wèn)題詳解的文章就介紹到這了,更多相關(guān)C++島嶼問(wèn)題內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

惠州市| 凤山县| 温州市| 怀宁县| 景谷| 石城县| 哈密市| 濉溪县| 余庆县| 大方县| 冷水江市| 建瓯市| 文成县| 平阳县| 宜丰县| 额尔古纳市| 聂荣县| 贵阳市| 临颍县| 襄城县| 阿尔山市| 镶黄旗| 马公市| 宾川县| 呼图壁县| 武汉市| 康平县| 武功县| 施秉县| 通州市| 洛隆县| 海宁市| 甘肃省| 万盛区| 灵川县| 商河县| 吴忠市| 菏泽市| 沧州市| 革吉县| 绥化市|