Aprendizaje de algoritmos C ++ (como: 1254. Cuente el número de islas cerradas)

Hay una cuadrícula de matriz bidimensional, y cada ubicación es tierra (marcada como 0) o área de agua (marcada como 1).

Partimos de un pedazo de tierra y podemos ir a áreas adyacentes en cuatro direcciones, arriba, abajo, izquierda y derecha Todas las áreas terrestres por las que podemos caminar se llaman "isla".

Si una isla está completamente rodeada de agua, es decir, todas las áreas adyacentes arriba, abajo, izquierda y derecha en el borde de la tierra son aguas, entonces la llamamos "isla cerrada".

Devuelva el número de islas cerradas.

Ejemplo 1:
Inserte la descripción de la imagen aquí

Entrada: cuadrícula = [[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]]
Resultado: 2
Explicación:
La isla en el área gris es una isla cerrada porque la isla está completamente rodeada de agua (es decir, rodeada por el área 1).

Ejemplo 2:
Inserte la descripción de la imagen aquí

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

Ejemplo 3:

Entrada: cuadrícula = [[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]]
salida: 2

提示:

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

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/number-of-closed-islands Los
derechos de autor son propiedad de LeetCode . Para reimpresiones comerciales, comuníquese con la autorización oficial. Para reimpresiones no comerciales, indique la fuente.

Obviamente, el primer recorrido en profundidad, la idea específica, usa DBS, regresa a la playa y regresa cuando es 1, porque es DBS, definitivamente puede atravesar un pequeño rango de tierra, y el recorrido se completa en la función principal. +1. Lo intentaré:

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

Supongo que te gusta

Origin blog.csdn.net/weixin_45743162/article/details/109558345
Recomendado
Clasificación