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. ![](https://i.imgur.com/PSrFJwN.png) ## 思路 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; } ``` ![](https://i.imgur.com/TtS4Ypy.png)