现在的位置: 首页 > 综合 > 正文

LA – 3263

2019年04月04日 ⁄ 综合 ⁄ 共 1824字 ⁄ 字号 评论关闭

求一笔画图形构成的的面有多少,用欧拉公式 V+F-E=2;(V顶点数,F面数,E边数);

关键求V,E;

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <complex>
using namespace std;
//#define  e 2.718281828459

const int maxn = 91000;
typedef complex<double> point;
typedef point Vector;
double Dot(Vector a,Vector b){return real(conj(a)*b);}
double Cross(Vector a,Vector b){return imag(conj(a)*b); }
//double exp(point te){return pow(e,Dot(te,te));}
Vector Rotate(Vector a,double rad){ return a*exp(point(0,rad));}

point read_point(){
double x,y;
scanf("%lf %lf",&x,&y);
return point(x,y);
}

double length(Vector A){
return sqrt(Dot(A,A));
}

double angle(Vector A,Vector B){
return acos(Dot(A,B)/length(A)/length(B));
}

point GetLineIntersection(point a,Vector v,point b,Vector w){
Vector u=a-b;
double t=Cross(w,u)/Cross(v,w);
return a+v*t;
}

const double eps=1e-10;
int dcmp(double x){
if(fabs(x)<eps) return 0; else return x<0? -1:1;
}

bool SegmentProperIntersection(point a1,point a2,point b1,point b2){
double c1=Cross(a2-a1,b1-a1),c2=Cross(a2-a1,b2-a1),
       c3=Cross(b2-b1,a1-b1),c4=Cross(b2-b1,a2-b1);
       return dcmp(c1)*dcmp(c2)<0 && dcmp(c3)*dcmp(c4)<0;
}

bool OnSegment(point p,point a1,point a2){
return dcmp(Cross(a1-p,a2-p))==0&&dcmp(Dot(a1-p,a2-p))<0;
}

point p[maxn],V[maxn];
int cmp(const point a,const point b){
double ax=real(a),ay=imag(a);
double bx=real(b),by=imag(b);
return dcmp(ax-bx)<0||(dcmp(ax-bx)==0&&dcmp(ay-by)<0);
}
int main()
{
    cout<<SegmentProperIntersection(point(0,0),point(1,1),point(0,2),point(2,0));
    int n,kase=0;
    while(scanf("%d",&n)==1&&n){

        for(int i=0;i<n;i++){
            p[i]=read_point();
        }

        n--;

        int v=0;
        for(int i=0;i<n;i++){
            V[v++]=p[i];
        }
        for(int i=0;i<n;i++)
          for(int j=i+1;j<n;j++){
             if(SegmentProperIntersection(p[i],p[i+1],p[j],p[j+1]))
                V[v++]=GetLineIntersection(p[i],p[i+1]-p[i],p[j],p[j+1]-p[j]);
        }

        sort(V,V+v,cmp);
        int m=unique(V,V+v)-V;
        v=m;

        int e=n;
        for(int i=0;i<v;i++)
           for(int j=0;j<n;j++){
           if(OnSegment(V[i],p[j],p[j+1])) e++;
        }

        printf("Case %d: There are %d pieces.\n",++kase,e+2-v);
    }
    return 0;
}

抱歉!评论已关闭.