---
# System prepended metadata

title: 'LeetCode #200 [Number of Islands](https://leetcode.com/problems/number-of-islands/)'
tags: [DFS, Recursion, LeetCode, Medium]

---

###### 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);
    }
};
```