class Solution(object):
    def maxAreaOfIsland(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        # because
        ans = 0
        for i in range(len(grid)):
            for j in range(len(grid[0])):
                if grid[i][j] == 1:
                    grid[i][j] = 0
                    ans = max(self.dfs(grid, i, j), ans)
                    # ans = max(self.bfs(grid, i, j), ans)
        return ans

    def dfs(self, grid, i, j):
        # DFS based on stack
        stack = [(i, j)]
        area = 0
        # Stack for DFS
        while stack:
            r, c = stack.pop(-1)
            area += 1
            for nr, nc in ((r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)):
                if (0 <= nr < len(grid) and
                        0 <= nc < len(grid[0]) and grid[nr][nc]):
                    stack.append((nr, nc))
                    grid[nr][nc] = 0
        return area

    # def bfs(self, grid, x, y):
    #     # BFS based on queue
    #     queue = [(x, y)]
    #     area = 0
    #     # Stack for DFS
    #     while queue:
    #         i, j = queue.pop(0)
    #         area += 1
    #         if i - 1 >= 0 and grid[i - 1][j] == 1:
    #             grid[i - 1][j] = 0
    #             queue.append((i - 1, j))
    #         if i + 1 < len(grid) and grid[i + 1][j] == 1:
    #             grid[i + 1][j] = 0
    #             queue.append((i + 1, j))
    #         if j - 1 >= 0 and grid[i][j - 1] == 1:
    #             grid[i][j - 1] = 0
    #             queue.append((i, j - 1))
    #         if j + 1 < len(grid[0]) and grid[i][j + 1] == 1:
    #             grid[i][j + 1] = 0
    #             queue.append((i, j + 1))
    #     return area

    # def maxAreaOfIsland(self, grid):
    #     # Recursive DFS
    #     seen = set()
    #     def area(r, c):
    #         if not (0 <= r < len(grid) and 0 <= c < len(grid[0])
    #                 and (r, c) not in seen and grid[r][c]):
    #             return 0
    #         seen.add((r, c))
    #         return (1 + area(r+1, c) + area(r-1, c) +
    #                 area(r, c-1) + area(r, c+1))

    #     return max(area(r, c)
    #                for r in range(len(grid))
    #                for c in range(len(grid[0])))