code: def dfs_grid_recursive(grid, i, j, mark='X', free='.'):
      
      height = len(grid)
      width = len(grid[0])
      grid[i][j] = mark              # mark path
      for ni, nj in [(i + 1, j), (i, j + 1),
                     (i - 1, j), (i, j - 1)]:
          if 0 <= ni < height and 0 <= nj < width:
              if grid[ni][nj] == free:
                  dfs_grid(grid, ni, nj)
docs: DFS on a grid, mark connected component, iterative version
  
      :param grid: matrix, 4-neighborhood
      :param i,j: cell in this matrix, start of DFS exploration
      :param free: symbol for walkable cells
      :param mark: symbol to overwrite visited vertices
      :complexity: linear