1254 - Number Of Closed Islands

#medium

Given a 2D grid consists of 0s (land) and 1s (water).  An island is a maximal 4-directionally connected group of 0s and a closed island is an island totally (all left, top, right, bottom) surrounded by 1s.

Return the number of closed islands.

Example 1:

Input: grid = [ [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] ]
Output: 2
Explanation:
Islands in gray are closed because they are completely surrounded by water (group of 1s).

Example 2:

Input: grid = [ [0,0,1,0,0],[0,1,0,1,0],[0,1,1,1,0] ]
Output: 1

class Solution {
public:

    bool dfs( vector<vector<int>> & grid, int m, int n, int i, int j ) {
        if ( i < 0 || i >=m || j < 0 || j >= n ) return false;
        if ( grid[i][j] == 1 ) return true;
        grid[i][j] = 1;
        bool left = dfs( grid, m, n, i - 1, j );
        bool right = dfs( grid, m, n, i + 1, j );
        bool up = dfs( grid, m, n, i, j - 1 );
        bool down = dfs( grid, m, n, i, j + 1 );
        return left && right && up && down;
    }

    int closedIsland(vector<vector<int>>& grid) {
        int result = 0;
        int m = grid.size();
        int n = grid[0].size();
        for ( int i = 0; i < m; i++ ) {
            for ( int j = 0; j < n; j++ ) {
                if ( grid[i][j] == 0 && dfs( grid, m, n, i, j ) ) result++; 
            }
        }

        return result;
    }
};