C ++アルゴリズムの学習(例:1254。閉じた島の数を数える)

2次元のマトリックスグリッドがあり、各場所は土地(0としてマーク)または水域(1としてマーク)のいずれかです。

土地から始めて、上下左右の4方向に隣接するエリアに行くことができます。歩いて行ける土地はすべて「島」と呼ばれています。

島が完全に水に囲まれている場合、つまり、土地の端の上下左右に隣接するすべての領域が水である場合、それを「閉じた島」と呼びます。

閉鎖された島の数を返送してください。

例1:
ここに画像の説明を挿入

入力:グリッド= [[1,1,1,1,1,1,1,0]、[1,0,0,0,0,1,1,0]、[1,0,1,0、 1,1,1,0]、[1,0,0,0,0,1,0,1]、[1,1,1,1,1,1,1,0]]
出力:2
説明:
灰色の領域の島は、島が完全に水に囲まれている(つまり、領域1に囲まれている)ため、閉じた島です。

例2:
ここに画像の説明を挿入

输入:grid = [[0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0]]
输出:1

例3:

入力:グリッド= [[1,1,1,1,1,1,1]、
[1,0,0,0,0,0,1]、
[1,0,1,1,1,0、 1]、
[1,0,1,0,1,0,1]、
[1,0,1,1,1,0,1]、
[1,0,0,0,0,0,1] 、
[1,1,1,1,1,1,1]]
出力:2

提示:

1 <= grid.length, grid[0].length <= 100
0 <= grid[i][j] <=1

出典:LeetCode
リンク:https ://leetcode-cn.com/problems/number-of-closed-islands
著作権はLeetCodeが所有しています商用転載の場合は、公認機関にご連絡ください。非商用転載の場合は、出典を明記してください。

明らかに、深さ優先探索、具体的なアイデアは、DBSを使用し、ビーチに戻り、1になると戻ります。これは、DBSであるため、狭い範囲の土地を確実に横断でき、横断はメイン機能で完了します。 +1。私が試してみます:

class Solution {
    
    
private:
int val =0;
public:
    int closedIsland(vector<vector<int>>& 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] == 0){
    
    
        val = 0;
        count+=dfs(grid,i,j)+val;
    }
    return count;
    }
    int dfs(vector<vector<int>>& grid,int i,int j){
    
    
        //如果在海边就让总数据减一
       if(i < 0 || i == grid.size() || j < 0|| j == grid[0].size())
       {
    
       val = -1;
           return 0;
       }
        if(grid[i][j]!=0) return 0;
        grid[i][j] = 1;
        dfs(grid,i,j+1);
        dfs(grid,i,j-1);
        dfs(grid,i+1,j);
        dfs(grid,i-1,j);
        return 1;      
    }
};

おすすめ

転載: blog.csdn.net/weixin_45743162/article/details/109558345