三角形上的格点数
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
typedef long long LL;
const int maxn = 10000 + 10;
int a,b,c,d,e,f;
///匹克定理 多边形的面积 = (多边形上的格点数) + 二分之一边界上的格点树 - 1
///海伦公式 三角形三边 a , b, c 那么p = (a+b+c)/2;
/// s = sqrt(p*(p-a)*(p-b)*(p-c))
///边界上的格点数可以用 gcd来判断 两点上的格点数 gcd(abs(x1-x2),abs(y1-y2)) - 1就是答案 注意没有算两点
int gcd(int a,int b)
{
return a==0?b:gcd(b%a,a);
}
//一个计算点阵中顶点在格点上的多边形面积公式:S=a+b/2-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积
void solve()
{
while(scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f)!=EOF)
{
double _a = sqrt( (a-c)*(a-c) + (b-d)*(b-d) );
//cout<<_a<<endl;
double _b = sqrt(double(((a-e)*(a-e)+(b-f)*(b-f))));
//cout<<_b<<endl;
double _c = sqrt(double(((c-e)*(c-e)+(d-f)*(d-f))));
//cout<<_c<<endl;
double p = (_a+_b+_c)/2;
//cout<<p<<endl;
double s = sqrt(p*(p-_a)*(p-_b)*(p-_c));
// cout<<s<<endl;
int x = gcd(abs(a-c),abs(b-d)) - 1;
//cout<<x<<endl;
int y = gcd(abs(a-e),abs(b-f)) - 1;
//cout<<y<<endl;
int z = gcd(abs(c-e),abs(d-f)) - 1;
// cout<<z<<endl;
double sum = s - 0.5*(x+y+z+3) +1;
cout<<int(sum)<<endl;
}
}
int main()
{
solve();
return 0;
}
三角形上的格点数
最新推荐文章于 2020-12-23 13:02:18 发布