1. 程式人生 > 其它 >力扣 leetcode 200. 島嶼數量

力扣 leetcode 200. 島嶼數量

問題描述

給你一個由 '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;
    }
};