Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
ORZ 求nb的测试数据#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<cstring> using namespace std; const double zero=1e-8; const int maxn=1588; int n; double r; bool iszero(double x){return abs(x)<0.0000001;} struct node { double x,y; node(){} node(double _x,double _y):x(_x),y(_y){} bool operator<(const node &s)const { if(!iszero(y-s.y))return y<s.y; return x<s.x; } void read() { scanf("%lf%lf",&x,&y); } void write() { printf("(%.2lf,%.2lf)\n",x,y); } }MAX(1e59,1e107),c,p[maxn]; double cp(node e1,node e2,node b) { return (e1.x-b.x)*(e2.y-b.y)-(e2.x-b.x)*(e1.y-b.y); } bool onseg(node p,node p1,node p2) { double lx=min(p1.x,p2.x),rx=max(p1.x,p2.x); double ly=min(p1.y,p2.y),ry=max(p1.y,p2.y); return (lx<=p.x&&p.x<=rx&&ly<=p.y&&p.y<=ry); } bool segtoseg_intersection(node i0,node i1,node j0,node j1) { double t1=cp(j0,i1,i0),t2=cp(j1,i1,i0); double t3=cp(i0,j0,j1),t4=cp(i1,j0,j1); if(t1*t2<0&&t3*t4<0)return 1; if(iszero(t1)&&onseg(j0,i0,i1))return 1; return 0; } bool linetoline_intersection(node i0,node i1,node j0,node j1) { double t1=cp(j0,i1,i0),t2=cp(j1,i1,i0); if(t1*t2<=0)return 1; return 0; } bool parallel(node p1,node p2,node p3,node p4) { double x12=p2.x-p1.x,x34=p4.x-p3.x; if(iszero(x12))return iszero(x34); double k1=(p2.y-p1.y)/x12,k2=(p4.y-p3.y)/x34; return iszero(k1-k2); } node gcp(node p1,node p2,node p3,node p4) { double a1=p1.y-p2.y,b1=p2.x-p1.x,c1=p1.x*p2.y-p2.x*p1.y; double a2=p3.y-p4.y,b2=p4.x-p3.x,c2=p3.x*p4.y-p4.x*p3.y; double x0=(c1*b2-c2*b1)/(a2*b1-a1*b2); double y0=(a2*c1-a1*c2)/(a1*b2-a2*b1); return node(x0,y0); } double get3area(node p1,node p2,node p3) { return abs(cp(p1,p2,p3)/2); } double get4area(node p1,node p2,node p3,node p4) { return get3area(p1,p2,p3)+get3area(p1,p4,p3); } double cf(double x){return x*x;} double dis(node a,node b) { return sqrt(cf(a.x-b.x)+cf(a.y-b.y)); } bool cc() { int dir=0; double temp=0; for(int i=0;i<n;++i) { temp=cp(p[i+2],p[i+1],p[i]); //printf("%lf %lf\n") if(!dir)dir=temp; if(dir*temp<0)return 0; } return 1; } bool PtoE_dis(node x,node a,node b) { return get3area(x,a,b)*2/dis(a,b); } bool inpolygon(node x) { int res=0; for(int i=0;i<n;++i) { if(parallel(x,MAX,p[i],p[i+1]))continue; if(segtoseg_intersection(x,MAX,p[i],p[i+1])) ++res; } return res&1; } int main() { //freopen("in.txt","r",stdin); while(1) { scanf("%d%lf",&n,&r);c.read(); if(n==1)break; for(int i=1;i<=n;++i) p[i].read(); p[0]=p[n];p[n+1]=p[1]; if(!cc())puts("HOLE IS ILL-FORMED"); else { bool flag1=1,flag2=1; if(!inpolygon(c))flag1=0; if(flag1)for(int i=0;i<n;++i) if(PtoE_dis(c,p[i],p[i+1])<r) { flag2=0;break; } if(flag1&&flag2)puts("PEG WILL FIT"); else puts("PEG WILL NOT FIT"); } } } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator