POJ 3384 Feng Shui 半平面交
水题,样例是错的,记得要考虑半平面交缩成一点, 水水就过了。
View Code
#include<stdio.h> #include<string.h> #include<math.h> #include<algorithm> using namespace std; struct point { double x, y; }p[105], tp[105], pp[105]; double a, b, c; int n, m; double r; void getline( point p1, point p2) { a = p2.y - p1.y; b = p1.x - p2.x; c = p2.x * p1.y - p2.y * p1.x; } point intersect(point p1, point p2) { double u = fabs(a * p1.x + b * p1.y + c); double v = fabs(a * p2.x + b * p2.y + c); point ret; ret.x = (v * p1.x + u * p2.x) / (u + v); ret.y = (v * p1.y + u * p2.y) / (u + v); return ret; } void cut() { int i, tm = 0; for(i = 1; i <= m; i++) { if(a * pp[i].x + b * pp[i].y + c >= 0) tp[++tm] = pp[i]; else { if(a * pp[i-1].x + b * pp[i-1].y + c > 0) tp[++tm] = intersect( pp[i-1], pp[i] ); if(a * pp[i+1].x + b * pp[i+1].y + c > 0) tp[++tm] = intersect( pp[i], pp[i+1] ); } } for(i = 1; i <= tm; i++) pp[i] = tp[i]; pp[0] = pp[tm]; pp[tm+1] = pp[1]; m = tm; } void solve() { int i; for(i = 1; i <= n; i++) pp[i] = p[i]; pp[0] = pp[n]; pp[n+1] = pp[1]; p[n+1] = p[1]; m = n; for(i = 1; i <= n; i++) { getline(p[i], p[i+1]); c -= r * sqrt(a * a + b * b); cut(); } } double f(double x) { return x * x; } double dis(point a, point b) { return sqrt( f(a.x - b.x) + f(a.y - b.y) ); } int main() { int i, j; while( ~scanf("%d%lf", &n, &r) ) { for(i = 1; i <= n; i++) scanf("%lf%lf", &p[i].x, & p[i].y); solve(); double ans = -1.0; if(m == 1) { printf("%.5f %.5f %.5f %.5f\n", pp[m].x, pp[m].y, pp[m].x, pp[m].y); continue; } double x1, y1, x2, y2; for(i = 1; i <= m; i++) for(j = i+1; j <= m; j++) if( ans < dis(pp[i], pp[j]) ) { ans = dis(pp[i], pp[j]); x1 = pp[i].x; y1 = pp[i].y; x2 = pp[j].x; y2 = pp[j].y; } printf("%.5f %.5f %.5f %.5f\n", x1, y1, x2, y2); } return 0; }


浙公网安备 33010602011771号