給定兩條線段(木板),形成一個槽,雨水垂直落下。求槽能蓄多少水。若兩線段不相交、平行、一條水平、或一條完全覆蓋另一條,則蓄水量為 0。否則計算交點與高點構成的三角形面積。
cross(a,b,c) 判斷轉向、面積。if (!segments_intersect(l1, l2)) ans=0;
else {
P = intersection(l1, l2);
A = higher_endpoint(l1); B = higher_endpoint(l2);
if (P == A || P == B) ans=0; // 開口朝上
else if (horizontal(l1) || horizontal(l2)) ans=0;
else if (one_covers_other(l1, l2, P)) ans=0;
else ans = triangle_area(P, A, B);
}
POJ 2826 是計算幾何分類討論的典型題。關鍵在於全面覆蓋邊界情況(不相交、水平、覆蓋、端點重合),並正確計算三角形面積。代碼較長但邏輯清晰,適合作為幾何模板練習。