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;
}
};