public class Solution {
private int[][] dirs = new int[4][]{
new int[]{0,1},
new int[]{1,0},
new int[]{-1,0},
new int[]{0,-1}
};
private Queue<int[]> queue = new Queue<int[]>();
public int ClosedIsland(int[][] grid) {
int result = 0;
for (int i = 0; i < grid.Length; i++){
for (int j = 0; j < grid[0].Length; j++){
if (grid[i][j] == 0){
queue.Enqueue(new int[]{i, j});
if (BFS(grid)) result++;
}
}
}
return result;
}
private bool BFS(int[][] grid){
bool island = true;
while (queue.Count > 0){
int[] land = queue.Dequeue();
foreach (int[] dir in dirs){
int r = land[0] + dir[0];
int c = land[1] + dir[1];
if (r < 0 || r >= grid.Length || c < 0 || c >= grid[0].Length){
island = false;
continue;
}
if (grid[r][c] == 0){
grid[r][c] = 1;
queue.Enqueue(new int[]{r,c});
}
}
}
return island;
}
}