您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: