給定一個 n×m 的矩形金屬板,需從中切出一個凸多邊形(≤8 頂點)。切割機只能沿直線完全切穿。求切出多邊形所需的最小總切割長度。切割必須沿多邊形邊緣進行。
next_permutation)。// 判斷兩線是否平行
bool parallel(Line a, Line b) {
return fabs(cross(a.b-a.a, b.b-b.a)) < EPS;
}
// 求兩線交點
Point intersection(Line a, Line b) {
// 解線性方程組
double d = cross(a.b-a.a, b.b-b.a);
return a.a + (a.b-a.a) * cross(b.a-a.a, b.b-b.a) / d;
}
// 判斷點 c 是否在向量 ab 的左側(或共線)
bool outside(Point a, Point b, Point c) {
return dot(c-a, b-a) > EPS;
}
// 計算切割線在當前多邊形上的切割長度
double cut_length(Line L, vector& current) {
Point p1, p2; // 兩個有效交點
double min1 = INF, min2 = INF;
for (Line& e : current) {
if (parallel(L, e)) continue;
Point ip = intersection(L, e);
double d1 = dist(L.a, ip), d2 = dist(L.b, ip);
if (outside(L.b, L.a, ip) && d1 < min1) { min1 = d1; p1 = ip; }
if (outside(L.a, L.b, ip) && d2 < min2) { min2 = d2; p2 = ip; }
}
return dist(p1, p2);
}
本題結合了幾何計算(線段相交、點線關係)與排列枚舉。關鍵在於正確維護「當前保留區域的邊界線集合」,並精確計算每次切割在當前邊界上的實際長度。適合作為計算幾何入門綜合練習。