```python
def gen_plan(initial: BridgeState, center_x: float, center_y: float, yaw: float, slack: float):
    import numpy as np

    actions = []

    # Get block size (assume all blocks are the same)
    block = initial.getFrame("block_red")
    block_size_z = block.size[-1]
    block_size_x = block.size[0]

    # Place the two vertical blocks (red and green)
    # They are parallel, so we align them along the y-axis, spaced by block_size_x + a little gap
    gap = 0.01  # small gap between blocks

    # Compute positions for the two vertical blocks
    dx = (block_size_x + gap) / 2.0
    dy = 0

    # First vertical block (red)
    red_x = center_x - dx * np.cos(yaw)
    red_y = center_y - dx * np.sin(yaw)
    actions.append(Action("pick", ["block_red", None]))
    actions.append(Action("place_sr", [red_x, red_y, None, None, yaw]))

    # Second vertical block (green)
    green_x = center_x + dx * np.cos(yaw)
    green_y = center_y + dx * np.sin(yaw)
    actions.append(Action("pick", ["block_green", None]))
    actions.append(Action("place_sr", [green_x, green_y, None, None, yaw]))

    # Place the horizontal block (blue) on top of the two vertical blocks
    # The horizontal block should be rotated 90 degrees (rotated=True)
    # Place it at the center, at a height above the vertical blocks
    blue_z = block_size_z + slack
    actions.append(Action("pick", ["block_blue", None]))
    actions.append(Action("place_sr", [center_x, center_y, blue_z, True, yaw]))

    return actions

def gen_initial_guess(initial: BridgeState):
    guess = {
        "center_x": 0.15,  # Center between the two vertical blocks
        "center_y": 0.0,
        "yaw": 0.0,
        "slack": 0.03,
    }
    sigma = 0.25
    return guess, sigma
```
