皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式,该公式可以表示为S=a+b/2-1,其中a表示多边形内部的点数,b表示多边形落在格点边界上的点数,S表示多边形的面积。
所以只需要求出来面积和边界的点数。
求一条边上的整点的个数__gcd(abs(x1-x2),abs(y1-y2))+1.
因为三角形在计算3个边的时候会有重复的端点被计算所以要减去3.
这个题在51nod后面的数据是错误的..

#include<bits/stdc++.h>
#define fp(i,a,b) for(int i=a;i<=b;i++)
typedef long long ll;
typedef double dl;
using namespace std;

const int maxn=2e5+7;
const ll M=1e9+7;
const int INF=0x3f3f3f3f;

int n,m;
int x1,y1,x2,y2,x3,y3;

double dis(int x1,int y1,int x2,int y2)
{
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void solve()
{
    int a=0;//a是边上的点.
    int b;
    b=__gcd(abs(x1-x2),abs(y1-y2))+__gcd(abs(x1-x3),abs(y1-y3))+__gcd(abs(x2-x3),abs(y2-y3));
    //printf("a:%d\n",b);
    double p;
    int s;
    s=(x1*y2+x3*y1+x2*y3-x3*y2-x2*y1-x1*y3)/2;//三角形面积 
    //printf("s:%lf\n",s);
    s=abs(s);
    s++;
    a=s-b/2;
    printf("%d\n",a);

}

int main()
{
    //ios::sync_with_stdio(0);
    //cin.tie(0),cout.tie(0);
    //int T; scanf("%d",&T)
    //for(int i=1;i<=T;i++)
    while(scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF)
    {
        if(x1==0&&x2==0&&x3==0&&y1==0&&y2==0&&y3==0) return 0;
        solve();
    }
    return 0;    
}