1. 程式人生 > >Area POJ - 1265 -皮克定理-叉積

Area POJ - 1265 -皮克定理-叉積

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;
}