LeetCode 200.Number of Islands (島嶼的個數)
阿新 • • 發佈:2018-11-20
題目描述:
給定一個由 '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); } };