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