C# DFS 代码
public class Solution {
private bool island;
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){
island = true;
DFS(i, j, grid);
if (island){
result++;
}
}
}
}
return result;
}
private void DFS(int i, int j, int[][] grid){
if (i < 0 || i >= grid.Length || j < 0 || j >= grid[0].Length){
island = false;
return;
}
if (grid[i][j] == 1) return;
grid[i][j] = 1;
DFS(i, j + 1, grid);
DFS(i + 1, j, grid);
DFS(i - 1, j, grid);
DFS(i, j - 1, grid);
}
}
C# BFS 代码
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){
// 遇到边界, 表示当前整个连通块都不行, 但是仍需要全部置1
island = false;
continue;
}
if (grid[r][c] == 0){
grid[r][c] = 1;
queue.Enqueue(new int[]{r,c});
}
}
}
return island;
}
}