國王要求建築師在城堡周圍建造一道牆,牆與城堡的最小距離至少為 L 英尺,且牆的長度必須最小。城堡形狀為多邊形,給定 N 個頂點座標(按順時針序),求滿足條件的最短牆長,結果四捨五入到英吋精度(誤差不超過 8 英吋)。
這是一個經典的計算幾何問題。關鍵在於發現:
// Graham 掃描核心邏輯
sort(points+1, points+n+1, cmp); // 按極角排序
graham(); // 構建凸包
double ans = 0;
for (int i = 2; i <= top; ++i)
ans += dist(stack[i-1], stack[i]); // 凸包周長
ans += 2 * PI * L; // 加上圓周長
printf("%d\n", int(ans + 0.5)); // 四捨五入
這類「多邊形向外擴展固定距離求周長/面積」的問題,核心公式皆為:
擴展後周長 = 原周長 + 2πL
擴展後面積 = 原面積 + 原周長×L + πL²
這是 Minkowski 和與幾何測度論的基礎應用。