力扣 leetcode 200. 島嶼數量
阿新 • • 發佈:2022-12-04
問題描述
給你一個由 '1'
(陸地)和 '0'
(水)組成的的二維網格,請你計算網格中島嶼的數量。
島嶼總是被水包圍,並且每座島嶼只能由水平方向和/或豎直方向上相鄰的陸地連線形成。
此外,你可以假設該網格的四條邊均被水包圍。
提示:
- m == grid.length
- n == grid[i].length
- 1 <= m, n <= 300
- grid[i][j] 的值為 '0' 或 '1'
示例
示例 1:
輸入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"] ] 輸出:1
示例 2:
輸入:grid = [
["1","1","0","0","0"],
["1","1","0","0","0"],
["0","0","1","0","0"],
["0","0","0","1","1"]
]
輸出:3
解題思路
這題要做的就是對圖進行遍歷,可以用深度優先搜尋(DFS),也可以用廣度優先搜尋(BFS)。使用 DFS 時,用 棧 儲存下一個要遍歷的位置;使用 BFS 時,使用 佇列 儲存下一個要遍歷的位置。我們在遍歷圖時,將所有的 '1' 置為另一個符號,以避免重複遍歷,統計最終我們的遍歷次數即可。
class Solution { public: int numIslands(vector<vector<char>>& grid) { stack<pair<int, int>> s; // DFS int res = 0; for(int i = 0; i < grid.size(); i++){ for(int j = 0; j < grid[0].size(); j++){ if(grid[i][j] == '1'){ res++; s.emplace(i, j); // 插入DFS的起點 grid[i][j] = 0; while(!s.empty()){ pair<int, int> p = s.top(); s.pop(); if(p.first < (grid.size() - 1) && grid[p.first + 1][p.second] == '1'){ // 判斷下方向是否是陸地 s.emplace(p.first + 1, p.second); grid[p.first + 1][p.second] = 0; } if(p.first > 0 && grid[p.first - 1][p.second] == '1'){ // 判斷上方向是否是陸地 s.emplace(p.first - 1, p.second); grid[p.first - 1][p.second] = 0; } if(p.second < (grid[0].size() - 1) && grid[p.first][p.second + 1] == '1'){ // 判斷左方向是否是陸地 s.emplace(p.first, p.second + 1); grid[p.first][p.second + 1] = 0; } if(p.second > 0 && grid[p.first][p.second - 1] == '1'){ // 判斷右方向是否是陸地 s.emplace(p.first, p.second - 1); grid[p.first][p.second - 1] = 0; } } } } } return res; } };