leetcode 1254 - Number of Closed Islands

https://leetcode.com/problems/number-of-closed-islands/

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
Example 3:

Input: grid = [[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]]
Output: 2

Constraints:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
public:
int closedIsland(vector<vector<int>>& grid) {
int rows = grid.size(), cols = grid[0].size();

int ans = 0;

for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
if (grid[r][c] == 0) {
int result = 1;
dfs(grid, r, c, result);
ans += result;
}
}
}

return ans;
}

void dfs(vector<vector<int>>& grid, int r, int c, int &result) {
int rows = grid.size(), cols = grid[0].size();

int dirs[] = {0, -1, 0, 1, 0};

for (int i = 0; i < 4; i++) {
int x = r + dirs[i];
int y = c + dirs[i+1];

if (x < 0 || x >= rows || y < 0 || y >= cols) {
result = 0;
continue;
}

if (grid[x][y] == 0) {
grid[x][y] = 1;
dfs(grid, x, y, result);
}
}
}
};