from fastapi import APIRouter from pydantic import BaseModel from typing import List, Any from problems.flower_planting.problem import FlowerPlantingProblem router = APIRouter( prefix="/flower_planting", tags=["flower_planting"], responses={404: {"description": "Not found"}}, ) problem_solver = FlowerPlantingProblem() class GenerateRequest(BaseModel): length: int = 10 n: int = 0 # 0 means auto-generate challenging N class SolveRequest(BaseModel): flowerbed: List[int] n: int algorithms: List[str] = ["greedy", "brute_force"] class BenchmarkRequest(BaseModel): sizes: List[int] = [10, 15, 20, 25] algorithms: List[str] = ["greedy", "brute_force"] @router.post("/generate") async def generate_case(req: GenerateRequest): return problem_solver.generate_case(length=req.length, n=req.n) @router.post("/solve") async def solve_case(req: SolveRequest): input_data = {"flowerbed": req.flowerbed, "n": req.n} results = [] for algo in req.algorithms: try: if algo == "brute_force" and len(req.flowerbed) > 25: results.append({ "algorithm": algo, "error": "Input too large for Brute Force (limit 25)", "skipped": True }) continue res = problem_solver.solve(input_data, algo) results.append(res) except Exception as e: results.append({"algorithm": algo, "error": str(e)}) return results @router.post("/benchmark") async def benchmark(req: BenchmarkRequest): benchmark_results = [] for size in req.sizes: input_data = problem_solver.generate_case(length=size) size_result = {"size": size, "algorithms": []} for algo in req.algorithms: try: if algo == "brute_force" and size > 25: size_result["algorithms"].append({ "algorithm": algo, "time_seconds": None, "skipped": True }) continue res = problem_solver.solve(input_data, algo) size_result["algorithms"].append(res) except Exception as e: size_result["algorithms"].append({"algorithm": algo, "error": str(e)}) benchmark_results.append(size_result) return benchmark_results