5 of 9
Before writing DFS, understand why recursion works here:
flood_fill starting at (0,0) on a grid of 1s surrounded by 0s:
Step 1: Paint (0,0) → 2, then call fill on its neighbors
Step 2: Each neighbor paints itself → 2, then calls fill on its neighbors
Step 3: Eventually every connected 1 is painted — then recursion unwinds
The key rules:
Write a function flood_fill(grid, row, col, new_color) that:
(row, col)new_colorgrid = [ [1, 1, 1], [1, 0, 1], [1, 1, 1] ] result = flood_fill(grid, 0, 0, 2) # [2, 2, 2] # [2, 0, 2] # [2, 2, 2] # All connected 1s become 2. The 0 in the center is untouched. grid2 = [ [1, 1, 0], [1, 0, 0], [0, 0, 1] ] result2 = flood_fill(grid2, 0, 0, 5) # [5, 5, 0] # [5, 0, 0] # [0, 0, 1] # Only the top-left connected 1s change. The lone 1 at (2,2) is not connected.
Store the original color at grid[row][col] before you change anything. You'll need it to check if neighbors match.
Base cases to return early:
grid[row][col] != original_color (wrong color or already painted)def flood_fill(grid, row, col, new_color): original_color = grid[row][col] rows, cols = len(grid), len(grid[0]) def fill(r, c): if r < 0 or r >= rows or c < 0 or c >= cols: return if grid[r][c] != original_color: return grid[r][c] = new_color fill(r - 1, c) fill(r + 1, c) fill(r, c - 1) fill(r, c + 1) fill(row, col) return grid