Area POJ - 1265 -皮克定理-叉積
阿新 • • 發佈:2019-01-13
Area
皮克定理是指一個計算點陣中頂點在格點上的多邊形面積公式,該公式可以表示為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; }