input: 
  def find_shortest_path(grid, start, end):
      """ Given a grid that represents a maze defined as a 2D list of integers, where 1 represents a navigable path and 0 represents a blocked path, and given start and end coordinates, find the shortest path from the start to the end.
      If no path exists, return an empty list.
  
      >>> find_shortest_path([[1, 0, 1], [1, 0, 1], [1, 1, 1]], (0, 0), (2, 2))
      [(0, 0), (1, 0), (2, 0), (2, 1), (2, 2)]
      >>> find_shortest_path([[1, 0, 0], [1, 0, 0], [1, 1, 1]], (0, 0), (2, 2))
      [(0, 0), (1, 0), (2, 0), (2, 1), (2, 2)]
      >>> find_shortest_path([[1, 0, 0], [1, 0, 0], [1, 0, 1]], (0, 0), (2, 2))
      []
      """
  
output:     
      from collections import deque
  
      def is_valid(x, y, grid):
          return 0 <= x < len(grid) and 0 <= y < len(grid[0]) and grid[x][y] == 1
  
      directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
      queue = deque([(start[0], start[1], [])])
      visited = set()
      visited.add(start)
  
      while queue:
          x, y, path = queue.popleft()
          path = path + [(x, y)]
  
          if (x, y) == end:
              return path
  
          for dx, dy in directions:
              nx, ny = x + dx, y + dy
              if is_valid(nx, ny, grid) and (nx, ny) not in visited:
                  visited.add((nx, ny))
                  queue.append((nx, ny, path))
  
      return []
  