input: Write a python function to find the shortest path between a given source cell to a destination cell in a grid.
  assert find_shortest_path([[1, 0, 0], [1, 1, 0], [1, 1, 1]], 3, 3) == {(0, 0), (1, 0), (1, 1), (2, 0), (2, 1), (2, 2)}
  assert find_shortest_path([[1, 1, 1], [0, 1, 0], [1, 1, 1]], 3, 3) == {(0, 0), (0, 1), (0, 2), (1, 1), (2, 0), (2, 1), (2, 2)}
  assert find_shortest_path([[1, 1], [1, 0]], 2, 2) == {(0, 0), (0, 1), (1, 0)}
output: def find_shortest_path(grid, rows, cols):
      from collections import deque
      
      if grid[0][0] == 0 or grid[rows-1][cols-1] == 0:
          return set()
      
      directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]
      queue = deque([((0, 0), [(0, 0)])])
      visited = set((0, 0))
      
      while queue:
          (x, y), path = queue.popleft()
          
          if (x, y) == (rows - 1, cols - 1):
              return set(path)
          
          for dx, dy in directions:
              nx, ny = x + dx, y + dy
              if 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] == 1 and (nx, ny) not in visited:
                  visited.add((nx, ny))
                  queue.append(((nx, ny), path + [(nx, ny)]))
      
      return set()