题意:链接略
方法:Pick定理
解析:
点都在格点上,求三角形内部多少个点。
S=a+b/2-1
a是内部点个数,b是边上点个数。
边上点个数显然就是仪仗队那道题?
于是gcd+Pick定理。
代码:
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
struct Point
{
int x,y;
Point(){}
Point(int _x,int _y):x(_x),y(_y){}
friend istream& operator >> (istream &_,Point &p)
{return scanf("%d%d",&p.x,&p.y),_;}
Point operator + (const Point &a)
{return Point(x+a.x,y+a.y);}
Point operator - (const Point &a)
{return Point(x-a.x,y-a.y);}
Point operator * (double rate)
{return Point(x*rate,y*rate);}
int operator * (const Point &a)
{return x*a.x+y*a.y;}
int operator ^ (const Point &a)
{return x*a.y-y*a.x;}
}a,b,c;
int gcd(int x,int y)
{
while(y)
{
int t=y;
y=x%y;
x=t;
}
return x;
}
int main()
{
while(cin>>a>>b>>c)
{
if(a.x==0&&a.y==0&&b.x==0&&b.y==0&&c.x==0&&c.y==0)break;
int s=abs((b-a)^(c-a));
int aaa=gcd(abs(b.x-a.x),abs(b.y-a.y))+gcd(abs(c.x-a.x),abs(c.y-a.y))+gcd(abs(c.x-b.x),abs(c.y-b.y));
printf("%d\n",(s+2-aaa)/2);
}
}