POJ 1265 Area(面积,pick公式)

来源:互联网 发布:java数据库连接池原理 编辑:程序博客网 时间:2024/04/27 17:03

转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove

题目:给出一些移动向量,最终形成一个多边形,求多边形的面积。以为多边形内部的格点数目和多边形边上的格点数目 。

首先面积可以通过叉积的性质求出。

多边形边上的格点数目可以枚举每条边求出。如果是水平或者垂直,显然可以得到,否则则是坐标差的最大公约数减1.(注这里是不计算端点的,端点必然在格点上,最后统计)

然后最后利用pick公式:多边形的面积=多边形边上的格点数目/2+多边形内部的格点数目-1。

#include<iostream>#include<fstream>#include<iomanip>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>#include<set>#include<map>#include<queue>#include<stack>#include<string>#include<vector>#include<sstream>#include<cassert>#define LL long long#define eps 1e-7#define inf 1<<30using namespace std;struct Point{    int x,y;}p[105];int n;int gcd(int a,int b){    return b==0?a:gcd(b,a%b);}int xmul(Point p0,Point p1,Point p2){    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}int get_area(){    int area=0;    for(int i=1;i<n-1;i++)        area+=xmul(p[0],p[i],p[i+1]);    return (area<0?-area:area);}int get_inedge(){    int ans=0;    for(int i=0;i<n;i++){        int xx=abs(p[i].x-p[i+1].x);        int yy=abs(p[i].y-p[i+1].y);        if(xx==0&&yy==0) ans+=0;        else if(xx==0) ans+=yy-1;        else if(yy==0) ans+=xx-1;        else ans+=gcd(xx,yy)-1;    }    return ans+n;}int main(){    int t,cas=0;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        p[0].x=0;p[0].y=0;        for(int i=1;i<=n;i++){            int xx,yy;            scanf("%d%d",&xx,&yy);            p[i].x=p[i-1].x+xx;            p[i].y=p[i-1].y+yy;        }        int area=get_area();        int edge=get_inedge();        int in=(area+2-edge)/2;        printf("Scenario #%d:\n%d %d %.1f\n\n",++cas,in,edge,area/2.0);    }    return 0;}


原创粉丝点击