###### tags: `LeetCode` `Medium` `DFS` `Recursion` # LeetCode #200 [Number of Islands](https://leetcode.com/problems/number-of-islands/) ### (Medium) 給你一個由 '1'(陸地)和 '0'(水)組成的的二維網格,請你計算網格中島嶼的數量。 島嶼總是被水包圍,並且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連接形成。 此外,你可以假設該網格的四條邊均被水包圍。 --- 遍歷每一個元素, 若值為'1'(島嶼), 則將島嶼數量+1, 並使用DFS探索周圍, 找出與該點連接的陸地, 並把陸地改為水(1變成0)。如此一來, 整個島嶼都會消失, 就不必擔心其他島嶼探索時會遇到。 當探索到最後一個元素時, 整個數組都應該為0, 此時已探索完全部島嶼, 回傳島嶼數量即可。 DFS探索時的終止條件為越界或是探索到水('0'), 這樣可以確保探索時只會找到與開始點相鄰的陸地。 --- ``` class Solution { public: int numIslands(vector<vector<char>>& grid) { int ans = 0; for(int i = 0; i <grid.size();i++){ for(int j = 0; j < grid[0].size();j++){ if(grid[i][j]=='1'){ ans++; dfs(grid, i, j); } } } return ans; } void dfs(vector<vector<char>>& grid, int i, int j){ if(i<0||j<0||i==grid.size()||j==grid[0].size()||grid[i][j]=='0')return; grid[i][j]='0'; dfs(grid, i-1, j); dfs(grid, i, j+1); dfs(grid, i+1, j); dfs(grid, i, j-1); } }; ```