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