1. 程式人生 > 其它 >1905. 統計子島嶼()

1905. 統計子島嶼()

labuladong 題解思路

難度中等

給你兩個 m x n 的二進位制矩陣 grid1 和 grid2 ,它們只包含 0 (表示水域)和 1 (表示陸地)。一個 島嶼 是由 四個方向 (水平或者豎直)上相鄰的 1 組成的區域。任何矩陣以外的區域都視為水域。

如果 grid2 的一個島嶼,被 grid1 的一個島嶼 完全 包含,也就是說 grid2 中該島嶼的每一個格子都被 grid1 中同一個島嶼完全包含,那麼我們稱 grid2 中的這個島嶼為 子島嶼 。

請你返回 grid2 中 子島嶼 的 數目 。

示例 1:

輸入:grid1 = [[1,1,1,0,0],[0,1,1,1,1],[0,0,0,0,0],[1,0,0,0,0],[1,1,0,1,1]], grid2 = [[1,1,1,0,0],[0,0,1,1,1],[0,1,0,0,0],[1,0,1,1,0],[0,1,0,1,0]]
輸出:3
解釋:如上圖所示,左邊為 grid1 ,右邊為 grid2 。
grid2 中標紅的 1 區域是子島嶼,總共有 3 個子島嶼。

示例 2:

輸入:grid1 = [[1,0,1,0,1],[1,1,1,1,1],[0,0,0,0,0],[1,1,1,1,1],[1,0,1,0,1]], grid2 = [[0,0,0,0,0],[1,1,1,1,1],[0,1,0,1,0],[0,1,0,1,0],[1,0,0,0,1]]
輸出:2 
解釋:如上圖所示,左邊為 grid1 ,右邊為 grid2 。
grid2 中標紅的 1 區域是子島嶼,總共有 2 個子島嶼。

提示:

  • m == grid1.length == grid2.length
  • n == grid1[i].length == grid2[i].length
  • 1 <= m, n <= 500
  • grid1[i][j]
     和 grid2[i][j] 都要麼是 0 要麼是 1 。
class Solution {
public:
    vector<vector<int>> dirs = {{1,0},{-1,0},{0,1},{0,-1}};
    void dfs(int i, int j, vector<vector<int>>& grid) {
        if( i<0 || i>=grid.size() || j<0 || j >= grid[0].size()) {
            return;
        }
        
if (grid[i][j] == 0) { return; } grid[i][j] = 0; for(auto ch : dirs) { dfs(i+ch[0],j+ch[1],grid); } } int countSubIslands(vector<vector<int>>& grid1, vector<vector<int>>& grid2) { //淹掉不是子島的方塊 for(int i = 0; i < grid1.size();i++) { for(int j = 0; j < grid1[0].size();j++) { if (grid1[i][j] == 0 && grid2[i][j]==1) { dfs(i,j,grid2); } } } //統計數量 int res = 0; for(int i = 0; i < grid1.size();i++) { for(int j = 0; j < grid1[0].size();j++) { if (grid2[i][j]==1) { dfs(i,j,grid2); res++; } } } return res; } };