POJ 2954 Triangle

POJ_2954

    这个题目的核心是Pick定理:对给定顶点坐标均是整点的简单多边形,其面积A和内部格点数目i、边上格点数目b满足:A=i+b/2-1。

    因此我们可以先求出三角形的面积以及边上的格点数,进而可以得到三角形内部的格点数。边上的格点数可以通过求|dx|和|dy|的最大公约数得到。

#include<stdio.h>
#include<string.h>
int x1, y1, x2, y2, x3, y3;
long long int ans, din, don;
long long int det(int x1, int y1, int x2, int y2)
{
return (long long int)x1 * y2 - (long long int)x2 * y1;
}
int abs(int x)
{
return x < 0 ? -x : x;
}
int gcd(int x, int y)
{
return y == 0 ? x : gcd(y, x % y);
}
void solve()
{
don = gcd(abs(x2 - x1), abs(y2 - y1)) + gcd(abs(x3 - x2), abs(y3 - y2)) + gcd(abs(x1 - x3), abs(y1 - y3));
ans = det(x2 - x1, y2 - y1, x3 - x1, y3 - y1);
ans = ans < 0 ? -ans : ans;
din = (ans - don) / 2 + 1;
printf("%lld\n", din);
}
int main()
{
for(;;)
{
scanf("%d%d%d%d%d%d", &x1, &y1, &x2, &y2, &x3, &y3);
if(!x1 && !y1 && !x2 && !y2 && !x3 && !y3)
break;
solve();
}
return 0;
}


原文地址:https://www.cnblogs.com/staginner/p/2354067.html