POJ1265 Area

来源:互联网 发布:手机淘宝与支付宝解绑 编辑:程序博客网 时间:2024/05/22 08:20
题目大意:

给一个平面上的简单多边形,求边上的点,多边形内的点,多边形面积。


1、以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其中,dxdy分别为线段横向占的点数和纵向占的点数。如果dx或dy为0,则覆盖的点数为dy或dx。
2、Pick公式:平面上以格子点为顶点的简单多边形的面积=边上的点数/2+内部的点数+1。

3、任意一个多边形的面积等于按顺序求相邻两个点与原点组成的向量的叉积之和。


#include<cstdio>#include<string>#include<iostream>#include<algorithm>using namespace std;struct node{    int x,y;} point[110];int n;int gcd(int a,int b){    if(b == 0)        return a;    return gcd(b,a%b);}int Area(node a,node b){    return a.x*b.y-a.y*b.x;}int main(){    int T,case1=0;    scanf("%d",&T);    while(T--)    {        case1++;        int a=0,p=0,dx,dy,i;        scanf("%d",&n);        point[0].x=0;        point[0].y=0;        for(i=1; i<=n; i++)        {            scanf("%d%d",&point[i].x,&point[i].y);            dx=point[i].x;            if(dx<0)                dx=-dx;            dy=point[i].y;            if(dy<0)                dy=-dy;            p+=gcd(dx,dy);            point[i].x+=point[i-1].x;            point[i].y+=point[i-1].y;            a+=Area(point[i],point[i-1]);        }        if(a<0)            a=-a;        printf("Scenario #%d:\n",case1);        printf("%d %d %.1f\n\n",(a-p+2)/2,p,0.5*a);    }    return 0;}


0 0
原创粉丝点击