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