1. 程式人生 > >LeetCode 200.Number of Islands (島嶼的個數)

LeetCode 200.Number of Islands (島嶼的個數)

題目描述:

給定一個由 '1'(陸地)和 '0'(水)組成的的二維網格,計算島嶼的數量。一個島被水包圍,並且它是通過水平方向或垂直方向上相鄰的陸地連線而成的。你可以假設網格的四個邊均被水包圍。

示例 1:

輸入:
11110
11010
11000
00000

輸出: 1

示例 2:

輸入:
11000
11000
00100
00011

輸出: 3

 

解題思路:

深度優先廣度優先,當遍歷到某個位置grid[i][j]時,判斷它是否為1,為1,則結果+1。然後去遞迴地遍歷它的前後左右,為1,也要去遍歷它的前後左右……凡是遍歷過的位置,都設定標誌位,避免重複的無用遍歷。

 

class Solution {
public:
    int numIslands(vector<vector<char>>& grid) {
        if (grid.empty()) return 0;
        int m = grid.size(), n = grid[0].size(), num = 0;   //m為行數,n為列數
        vector<vector<bool>> visited(m, vector<bool> (n, false));
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j] == '1' && !visited[i][j]) {
                    num++;
                    markIslands(grid, visited, i, j);
                }
            }
        }
        return num;
    }
private: 
    void markIslands(vector<vector<char>>& grid, vector<vector<bool>>& visited, int r, int c) {
        visited[r][c] = true;
        int m = grid.size(), n = grid[0].size();
        if (r - 1 >= 0 && grid[r - 1][c] == '1' && !visited[r - 1][c])
            markIslands(grid, visited, r - 1, c);
        if (r + 1 < m && grid[r + 1][c] == '1' && !visited[r + 1][c])
            markIslands(grid, visited, r + 1, c);
        if (c - 1 >= 0 && grid[r][c - 1] == '1' && !visited[r][c - 1])
            markIslands(grid, visited, r, c - 1);
        if (c + 1 < n && grid[r][c + 1] == '1' && !visited[r][c + 1])
            markIslands(grid, visited, r, c + 1);
    }
};