POJ 1474 || Video Surveillance(半平面交
2015-05-09 20:45
260 查看
拿上一题代码改一下直接就过了,躶题233 我连题目都没看 看着题目的配图感觉都是那个意思,随便一交就AC了。66666.。。。
#include <math.h> #include <stdio.h> #include <iostream> #include <algorithm> #define eps 1e-8 using namespace std; const int maxn = 200; int dq[maxn], lst, fir, pn, order[maxn], ln; struct Point { double x, y; Point(double xx=0.0,double yy=0.0):x(xx),y(yy){} double operator ^ (const Point &b)const{ return x*b.y - y*b.x; } Point operator - (const Point &b)const{ return Point(x-b.x,y-b.y); } } p[maxn]; struct Line { Point a, b; double angle; Line(){} Line( Point a,Point b) { this->a = a; this->b = b; angle = atan2( b.y-a.y,b.x-a.x); } } l[maxn]; int dcmp(double x) { if(fabs(x) < eps) return 0; return x > 0 ? 1 : -1; } double cross(Point p0, Point p1, Point p2) { return (p1-p0)^(p2-p0); } bool cmp(int u, int v) { double d = dcmp(l[u].angle-l[v].angle); if(dcmp(d)==0) return dcmp(cross(l[u].a, l[v].a, l[v].b)) < 0; //大于0取向量左半部分为半平面,小于0,取右半部分 return d < 0; } void get_line_intersect(Line l1, Line l2, Point& p) { double cp1, cp2; cp1 = cross(l2.a, l1.b, l1.a); cp2 = cross(l1.b, l2.b, l1.a); p.x = (l2.a.x * cp2 + l2.b.x * cp1) / (cp2 + cp1); p.y = (l2.a.y * cp2 + l2.b.y * cp1) / (cp2 + cp1); } bool judge(Line l0, Line l1, Line l2) { Point p; get_line_intersect(l1, l2, p); return dcmp(cross(p, l0.a, l0.b)) > 0; //大于小于符号与上面cmp()中注释处相反 } void addLine(Point a,Point b) { l[ln] = Line(a,b); order[ln] = ln; ln++; } void half_plane_inrer_sect() { int i, j; sort(order, order+ln, cmp); for(i = 1, j = 0; i < ln; i++) if(dcmp(l[order[i]].angle-l[order[j]].angle) > 0) order[++j] = order[i]; ln = j + 1; dq[0] = order[0]; dq[1] = order[1]; fir = 0; lst = 1; for(i = 2; i < ln; i++) { while(fir < lst && judge(l[order[i]], l[dq[lst-1]], l[dq[lst]])) lst--; while(fir < lst && judge(l[order[i]], l[dq[fir+1]], l[dq[fir]])) fir++; dq[++lst] = order[i]; } while(fir < lst && judge(l[dq[fir]], l[dq[lst-1]], l[dq[lst]])) lst--; while(fir < lst && judge(l[dq[lst]], l[dq[fir+1]], l[dq[fir]])) fir++; } bool is_view() { if(lst-fir > 1) return true; return false; } int main() { int f = 0; while ( ~scanf ("%d", &pn) && pn ) { scanf ("%lf%lf", &p[0].x, &p[0].y); ln = 0; for(int i = 1; i < pn; i++) { scanf ("%lf%lf", &p[i].x, &p[i].y); addLine(p[i-1], p[i]); } addLine(p[pn-1],p[0]); half_plane_inrer_sect(); if(f) puts(""); printf("Floor #%d\n",f+1); if(is_view()) printf ("Surveillance is possible.\n"); else printf ("Surveillance is impossible.\n"); f++; } return 0; }
相关文章推荐
- POJ 1474 Video Surveillance
- POJ 1474
- ●poj 1474 Video Surveillance
- Video Surveillance POJ - 1474
- bsoj 1850 【POJ1474】监控摄像头
- poj 1474 Video Surveillance (半平面交)
- POJ 1474 ZOJ 1248 HDU 1469 Video Surveillance 半平面交
- poj 3335 && poj 3130 && poj 2451 && poj 1474(n(logn)求解半平面交)
- poj 1474 Video Surveillance (半平面交)
- POJ 1474 Video Surveillance 笔记
- POJ 1474 Video Surveillance 半平面交
- poj 1474 Video Surveillance 【半平面交】
- POJ 1474 Video Surveillance
- POJ 1474 Video Surveillance
- POJ 1474 Video Surveillance 半平面交求多边形内核存在性
- POJ 1474 Video Surveillance
- POJ 1474 Video Surveillance(判断多边形是否有核)
- [poj 1474]Video Surveillance[半平面交][多边形的核]
- poj 1474 Video Surveillance(半平面交)
- BSOJ1850:POJ1474摄像头 计算几何 半平面交