https://leetcode.cn/problems/count-sub-islands/
给你两个 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 个子岛屿。
class Solution:
def countSubIslands(self, grid1: List[List[int]], grid2: List[List[int]]) -> int:
# 题解包括3个部分:1、定义淹没函数,2、淹没非子岛屿,3、双层for循环
# 思路:grid2中的一块陆地在grid1中是海水,那么整个岛屿就不是grid1的子岛
m, n = len(grid1), len(grid1[0])
# 由于有2个grid,所以grid必须是函数参数,有1个grid时,就不需要
def dfs(grid, i, j):
if not 0 <= i < m or not 0 <= j < n:
return
if grid[i][j] == 0:
return
grid[i][j] = 0
dfs(grid, i - 1, j)
dfs(grid, i + 1, j)
dfs(grid, i, j - 1)
dfs(grid, i, j + 1)
# def bfs(grid, i, j):
# q = [[i, j]]
# while q:
# [i, j] = q.pop(0)
# if not 0 <= i < m or not 0 <= j < n:
# continue
# if grid[i][j] == 0:
# continue
# grid[i][j] = 0
# q += [[i - 1, j], [i + 1, j], [i, j - 1], [i, j + 1]]
# grid2中(i, j)是陆地,但是grid1中是海水时,淹掉整座岛屿
# 剩下的子岛,放入主循环
for i in range(m):
for j in range(n):
if grid1[i][j] == 0 and grid2[i][j] == 1:
dfs(grid2, i, j)
cnt = 0
for i in range(m):
for j in range(n):
if grid2[i][j] == 1: # 是判断grid2
cnt += 1
dfs(grid2, i, j)
return cnt