欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Cows poj 3348 (凸包+多边形面积)

程序员文章站 2024-03-16 19:50:52
...

Cows poj 3348
分类:凸包+多边形面积
题意:给出点的位置,求最大面积。答案除以50(emmm我求出最大面积然后和答案一直不一样,后来发现。。。忘记除以50了)
思路:运用了Graham_Scan 算法和求多边形面积公式。
AC代码:

//例题;Graham算法
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=10010;
struct point{
    double x,y;
    bool operator <(const point &u)const{
        if(y==u.y) return x<u.x;
        return y<u.y;
    }
}p[N];//存储
int res[N],top;
bool mult(point sp,point ep,point op)
{
    return (sp.x-op.x)*(ep.y-op.y)>=(ep.x-op.x)*(sp.y-op.y);
}
void Graham(int n)
{
    int len;
    top=1;
    sort(p,p+n);
    if(n==0) return;res[0]=0;
    if(n==1) return;res[1]=1;
    if(n==2) return;res[2]=2;
    for(int i=2;i<n;i++){
        while(top&&mult(p[i],p[res[top]],p[res[top-1]])) top--;
        res[++top]=i;
    }
    len=top;
    res[++top]=n-2;
    for(int i=n-3;i>=0;i--){
       while(top!=len&&mult(p[i],p[res[top]],p[res[top-1]])) top--;
        res[++top]=i;
    }
}
//多边形面积求解,也可以用三角形的方式
struct Tpoint
{
    double x,y;
    Tpoint(){}
    Tpoint(double _x,double _y){x=_x;y=_y;}
    Tpoint operator -(Tpoint &b)const {
        return Tpoint(x-b.x,y-b.y);
    }
}ans[N];
double cross(Tpoint A,Tpoint B)//三角形面积
{
    //return fabs((B.x-A.x)*(C.x-A.y)-(C.x-A.x)*(B.y-A.y))/2;
    return A.x*B.y-A.y*B.x;
}
double poly_are(int n)
{
    double tmp=0.00;
    for(int i=1;i<n-1;i++)
    tmp+=cross(ans[i]-ans[0],ans[i+1]-ans[0]);
    return fabs(tmp)/100.0;
}
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int s,i,cnt=0;
        for(int i=0;i<n;i++) 
        scanf("%lf%lf",&p[i].x,&p[i].y);
        if(n<3) 
        {
            printf("0\n");
            continue;
        }
        Graham(n);
        for(s=0;s<top;s++)
        if(!p[res[s]].x&&!p[res[s]].y) break;
        for(i=s;i<top;i++)
        ans[cnt++]=Tpoint(p[res[i]].x,p[res[i]].y);//,printf(" %lf %lf \n",p[res[i]].x,p[res[i]].y);
        for(i=0;i<s;i++)
        ans[cnt++]=Tpoint(p[res[i]].x,p[res[i]].y);//,printf(" %lf %lf \n",p[res[i]].x,p[res[i]].y);
        double out=poly_are(cnt);
        printf("%d\n",(int)out);
    }
    return 0;
}