<p>You are given two <code>m x n</code> binary matrices <code>grid1</code> and <code>grid2</code> containing only <code>0</code>&#39;s (representing water) and <code>1</code>&#39;s (representing land). An <strong>island</strong> is a group of <code>1</code>&#39;s connected <strong>4-directionally</strong> (horizontal or vertical). Any cells outside of the grid are considered water cells.</p>

<p>An island in <code>grid2</code> is considered a <strong>sub-island </strong>if there is an island in <code>grid1</code> that contains <strong>all</strong> the cells that make up <strong>this</strong> island in <code>grid2</code>.</p>

<p>Return the <em><strong>number</strong> of islands in </em><code>grid2</code> <em>that are considered <strong>sub-islands</strong></em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2021/06/10/test1.png" style="width: 493px; height: 205px;" />
<pre>
<strong>Input:</strong> 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]]
<strong>Output:</strong> 3
<strong>Explanation: </strong>In the picture above, the grid on the left is grid1 and the grid on the right is grid2.
The 1s colored red in grid2 are those considered to be part of a sub-island. There are three sub-islands.
</pre>

<p><strong class="example">Example 2:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2021/06/03/testcasex2.png" style="width: 491px; height: 201px;" />
<pre>
<strong>Input:</strong> 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]]
<strong>Output:</strong> 2 
<strong>Explanation: </strong>In the picture above, the grid on the left is grid1 and the grid on the right is grid2.
The 1s colored red in grid2 are those considered to be part of a sub-island. There are two sub-islands.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>m == grid1.length == grid2.length</code></li>
	<li><code>n == grid1[i].length == grid2[i].length</code></li>
	<li><code>1 &lt;= m, n &lt;= 500</code></li>
	<li><code>grid1[i][j]</code> and <code>grid2[i][j]</code> are either <code>0</code> or <code>1</code>.</li>
</ul>

class Solution:
    def countSubIslands(self, grid1: List[List[int]], grid2: List[List[int]]) -> int:
        #First find number of islands in grid 2
        global checked        
        checked = set()
        islands = 0

        self.yLength = len(grid2)
        self.xLength = len(grid2[0])


        for row in range(self.yLength):
            for col in range(self.xLength):

                if grid2[row][col] == 1:

                    if (row, col) in checked:
                        continue

                    island, isIsland = self.fillIsland(grid1, grid2, row, col)
                    checked.update(island)
                    if isIsland:
                        print(row, col)
                        islands += 1

        return islands

    def fillIsland(self, grid1, grid2, y, x):
        #Rewrite this function, so that if grid2 value is 0 we continue, if value has been checked we continue, if grid1 fail we False
        island = set()
        queue = [(y, x)]
        while len(queue) > 0:
            n = queue.pop(0)
            if self.checkInside(grid2, n) == False:
                continue
            if self.checkInside(grid1, n) == False:
                return island, False
            if n in island:
                continue
            island.add(n)

            
            y, x = n
            queue.append((y+1, x))
            queue.append((y-1, x))
            queue.append((y, x+1))
            queue.append((y, x-1))
            
            """
            if self.checkInside(grid2, n) and not n in checked:
                if self.checkInside(grid1, n) == False:
                    return False
                checked.add(n)
                y, x = n
                queue.append((y+1, x))
                queue.append((y-1, x))
                queue.append((y, x+1))
                queue.append((y, x-1))
            """
        
        return island, True

    def checkInside(self, grid, n):
        y, x = n
        #yLength = len(grid)
        #xLength = len(grid[0])

        if 0 <= y < self.yLength and 0 <= x < self.xLength:
            return grid[y][x] == 1
        return False

    def checkIsland(self, grid, island):
        for row, col in island:
            if grid[row][col] == 0:
                return False
        return True


        
2759