問題描述
給定 n 條線段(n ≤ 100),端點座標整數範圍 [-50, 50],怪獸固定在原點 (0,0)。線段不經過原點,任意兩線段最多一交點,無三線段共點,交點距離 > 1e-5。判斷這些線段是否圍成封閉區域將原點包住(無縫隙)。
核心思路:射線法判斷點在多邊形內
- 將所有線段視為平面圖的邊,計算所有交點,構建平面圖的 DCEL(雙連邊表)或簡化的邊結構。
- 從原點向任意方向(如 +X 軸)發射射線,統計射線與所有線段的交點數。
- 若交點數為奇數 → 原點在封閉區域內 → 輸出 "yes";偶數 → "no"。
關鍵細節處理
- 線段相交判定:向量叉積法,排除共線重疊(題目保證最多一交點)。
- 射線與線段交點計算:參數方程求解,注意端點邊界情況(射線通過端點時避免重複計數)。
- 數值穩定性:座標範圍小,double 精度足夠;題目保證交點距離 > 1e-5,無退化情況。
複雜度分析
- 線段對檢查相交:O(n²) = 10⁴ 量級,極快。
- 射線掃描:O(n) 每條線段檢查一次。
- 總體 O(n²) 完全滿足限制。
參考實作
完整 AC 代碼與幾何模板可參考:CSDN 題解
