input: Write a function to find the shortest path between two points in a matrix, represented by a starting and ending tuple of coordinates. The function should return the shortest path length, with a default value of infinity if no path is found.
  
  def shortest_path(matrix, start, end):
    queue = []
    min_len = math.inf
    queue.append([start])
    while queue:
      path = queue.pop(0)
      x, y = path[-1]
      if (x, y) == end:
        if len(path) < min_len:
          min_len = len(path)
      for dx, dy in [[-1, 0], [1, 0], [0, -1], [0, 1]]:
        new_x, new_y = x + dx, y + dy
        if 0 <= new_x < len(matrix) and 0 <= new_y < len(matrix[0]):
          if matrix[new_x][new_y] == 0:
            queue.append(path + [(new_x, new_y)])
    return min_len
  
  assert shortest_path([[2, 3, 5], [1, 7, 6], [3, 0, 9]], (0, 0), (2, 2)) == 5
  assert shortest_path([[1, 2], [3, 4]], (0, 0), (1, 1)) == math.inf
  assert shortest_path([[0, 0], [0, 0]], (0, 0), (1, 1)) == 3
  assert shortest_path([[1, 0, 0], [0, 1, 0], [0, 0, 1]], (0, 0), (2, 2)) == 5
  assert shortest_path([], (0, 0), (0, 0)) == math.inf
output: 
  def shortest_path(matrix, start, end):
    if not matrix or not matrix[0]:
      return math.inf
    queue = []
    min_len = math.inf
    queue.append([start])
    while queue:
      path = queue.pop(0)
      x, y = path[-1]
      if (x, y) == end:
        if len(path) < min_len:
          min_len = len(path)
      for dx, dy in [[-1, 0], [1, 0], [0, -1], [0, 1]]:
        new_x, new_y = x + dx, y + dy
        if 0 <= new_x < len(matrix) and 0 <= new_y < len(matrix[0]):
          if matrix[new_x][new_y] == 0:
            queue.append(path + [(new_x, new_y)])
    return min_len
  