http://poj.org/problem?id=1265
pick定理
对于方格点形成多边形
面积=(内点)+(边上点/2)-1
线段边上点数为(两点横坐标距离,两点纵坐标距离)的最大公约数 再加一
对于本题来说 再加一的话 到最后还得剪掉 因为会重复计算 所以直接不加一就可以
面积的求法 就是把多边形分割成多个三角形 需要自己动手画画
#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=105;
structnode
{
int x,y;
}mem[N];
int gcd(int x,int y)
{
if(y==0)
return x;
return gcd(y,x%y);
}
int main()
{
int T;
cin>>T;
for(int w=1;w<=T;++w)
{
int n;
cin>>n;
for(int i=0;i<n;++i)
{
cin>>mem[i].x>>mem[i].y;
if(i)
{
mem[i].x+=mem[i-1].x;
mem[i].y+=mem[i-1].y;
}
}
mem[n].x=mem[0].x;
mem[n].y=mem[0].y;
double sum=0.0;
int sidepointsum=0;
for(int i=0;i<n;++i)
{
sum=sum+(mem[i].x*mem[i+1].y-mem[i+1].x*mem[i].y);
sidepointsum+=gcd(abs(mem[i].x-mem[i+1].x),abs(mem[i].y-mem[i+1].y));
}
sum=sum/2.0;
printf("Scenario #%d:\n",w);
printf("%d %d %.1f\n\n",((int)(sum)+1)-sidepointsum/2,sidepointsum,sum);
}
return 0;
}