POJ 2954 Triangle

本文介绍如何使用Pick定理计算三角形内部的格点数目。通过求解三角形的面积及边上的格点数,利用最大公约数方法辅助计算,最终得出三角形内部格点数量。

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值