Infiniti

   :: 首页  :: 新随笔  ::  ::  :: 管理

Area

 POJ - 1265 

皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式,该公式可以表示为2S=2a+b-2,

其中a表示多边形内部的点数,b表示多边形边界上的点数,S表示多边形的面积。

适用范围:必须是格点多边形。S = A / 2 + B - 1

#include<stdio.h>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 1234
struct node
{
    int x,y;
} a[maxn];
int s1[maxn],s2[maxn];
double area;
int t,m,A,B;
int main()
{
    scanf("%d",&t);
    for(int i=1; i<=t; i++)
    {
        a[0].x=a[0].y=0;
        area=A=0;
        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        scanf("%d",&m);
        for(int j=1; j<=m; j++)
        {
            scanf("%d%d",&a[j].x,&a[j].y);
            if(a[j].x==0)A+=abs(a[j].y);
            else if(a[j].y==0)A+=abs(a[j].x);
            else A+=__gcd(abs(a[j].x),abs(a[j].y));
            a[j].x+=a[j-1].x;
            a[j].y+=a[j-1].y;
        }
        a[m+1]=a[1];
        for(int j=1; j<=m; j++)
        {
            s1[j]+=s1[j-1]+a[j].x*a[j+1].y;
            s2[j]+=s2[j-1]+a[j].y*a[j+1].x;
        }
        area=abs(s1[m]-s2[m]);
        B=(area+2-A)/2;
        area=double(area)/2.0;
        printf("Scenario #%d:\n%d %d %.1f\n\n",i,B,A,area);
    }
    return 0;
}

  

 

posted on 2019-01-13 19:34  自由缚  阅读(274)  评论(0编辑  收藏  举报