# 200-Number of islands
###### tags: `Medium`
* Key:
1. BFS
a. 用兩個for-loop遍尋地圖上每個點,一遇到陸地(1),就會將島嶼數量加一,
b.先將一個點放到Queue中,如果是陸地就開始檢查其上下左右是否在地圖中?、是否也為陸地?若為陸地就加入Queue中並改為海洋(0),檢查完後,再將其從Queue中移除,直到Queue中沒有元素,代表搜尋完一個小島面積,以此類推遍尋所有陸地得到所有小島
2. DFS
a. 用兩個for-loop遍尋地圖上每個點,一遇到陸地(1),就會將島嶼數量加一,
b. 將該陸地設為海洋(0),以及為了避免將其他小島也設為海洋,所以檢查該陸地**上下左右**是否為陸地,是的話,也設成海洋,這樣島嶼數量加一前,就能先設成海洋。遇到海洋則繼續遍尋,直到遍尋完成整個地圖
3.BFS相較於DFS,可以避免地圖為大面積時,遞迴數量增大而產生的Stack overflow
## DFS Solution
```cpp=
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int m = grid.size(), n = m ? grid[0].size() : 0, islands = 0;
// 走過矩陣的所有 element,只要遇到島,就把島都消滅(即 '1' -> '0')
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '1') {
islands++;
dfs(grid, m, n, i, j);
}
}
}
return islands;
}
private:
void dfs(vector<vector<char>>& grid, const int& m, const int& n, const int& i, const int& j) {
if(grid[i][j] == '0') return;
grid[i][j] = '0';
if(i - 1 >= 0) { dfs(grid, m, n, i-1, j); }
if(i + 1 < m) { dfs(grid, m, n, i+1, j); }
if(j - 1 >= 0) { dfs(grid, m, n, i, j-1); }
if(j + 1 < n) { dfs(grid, m, n, i, j+1); }
}
};
```
```cpp=
class Solution {
public:
int numIslands(vector<vector<char>>& grid) {
int m = grid.size(), n = m ? grid[0].size() : 0, islands = 0, offsets[] = {0, 1, 0, -1, 0};
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (grid[i][j] == '1') {
islands++;
grid[i][j] = '0';
queue<pair<int, int>> todo;
todo.push({i, j});
while (!todo.empty()) {
pair<int, int> p = todo.front();
todo.pop();
for (int k = 0; k < 4; k++) {
int r = p.first + offsets[k], c = p.second + offsets[k + 1];
if (r >= 0 && r < m && c >= 0 && c < n && grid[r][c] == '1') {
grid[r][c] = '0';
todo.push({r, c});
}
}
}
}
}
}
return islands;
}
};
```