题意:链接略
方法: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);
}
}
本文介绍了一种使用Pick定理解决求解三角形内部格点数量的方法。通过计算边界上的格点数量并结合三角形面积,利用最大公约数(gcd)辅助求解,最终得出三角形内部的格点总数。
1008

被折叠的 条评论
为什么被折叠?



