Pick定理:设以整数点为顶点的多边形的面积为S,多边形内部的整数点数为N,边界上的整数点数为L,则N+1/2*L-1=S;
下面给出计算N,L,S的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <math.h>
using namespace std;
struct F
{
int x,y;
} a[105]; //x为横坐标,y为纵坐标
int n;
int S=0,L=0,N=0;
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
void OnEdge() //计算L
{
for(int i=0; i<n; i++)
{
L+=gcd(fabs(a[i].x-a[(i+1)%n].x),fabs(a[i].y-a[(i+1)%n].y));
}
}
void Area() //计算S
{
for(int i=0; i<n; i++)
S+=a[i].x*a[(i+1)%n].y-a[i].y*a[(i+1)%n].x;
S=S*0.5;
}
void Inside() //计算N
{
N=(2*S-L+2)/2;
}
int main()
{
int t;
while(cin>>t)
{
cin>>n;
for(int i=0; i<n; i++)
{
cin>>a[i].x>>a[i].y;
}
Area();
OnEdge();
Inside();
cout<<"多边形内的整数点的数"<<N<<endl;
cout<<"多边形边上的整数点的数"<<L<<endl;
cout<<"多边形的面积:"<<S<<endl;
}
}