Leetcode 1254. Number of Closed Islands in C [C語言]
==
###### tags: `Leetcode` `DFS` `Graph`
## Description
(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.

## 思路
0是海
1是陸地
要被海圍起來的才算是陸地,所以貼在邊上的都不算,要優先把它清掉
所以會先跑一圈在四周的DFS會把貼在邊上的0都清乾淨
所以接下來只要計算在剩下的圖中產生的island,也是用相同的DFS跑就好了,再加上一個count來計算有多少島嶼,很簡單。
主要是最一開始要使用DFS清編編的0才是這問題的重點。
## 程式
```c=
void DFS(int **grid, int gridSize, int gridColSize, int r, int c){
if(r<0 || c<0 || r>gridSize-1 || c>gridColSize-1 || grid[r][c]==1)
return;
if(grid[r][c]==0){
grid[r][c]=1;
DFS(grid, gridSize, gridColSize, r+1, c);
DFS(grid, gridSize, gridColSize, r-1, c);
DFS(grid, gridSize, gridColSize, r, c+1);
DFS(grid, gridSize, gridColSize, r, c-1);
}
}
int closedIsland(int** grid, int gridSize, int* gridColSize){
int i, j;
int count=0;
for(i=0; i<*gridColSize; i++){
DFS(grid, gridSize, *gridColSize, 0, i);
DFS(grid, gridSize, *gridColSize, gridSize-1, i);
}
for(i=0; i<gridSize; i++){
DFS(grid, gridSize, *gridColSize, i, 0);
DFS(grid, gridSize, *gridColSize, i, (*gridColSize)-1);
}
for(i=0; i< gridSize; i++){
for(j=0; j<*gridColSize; j++){
if(grid[i][j]==0){
DFS(grid, gridSize, *gridColSize, i, j);
count++;
}
}
}
return count;
}
```
