POJ 1265 Area

POJ_1265

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

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

#include<stdio.h>
#include<string.h>
long long int ans, din, don;
int abs(int x)
{
return x < 0 ? -x : x;
}
long long int det(int x1, int y1, int x2, int y2)
{
return (long long int )x1 * y2 - (long long int)x2 * y1;
}
int gcd(int x, int y)
{
return y == 0 ? x : gcd(y, x % y);
}
void solve()
{
int i, j, k, n, d, dx, dy, x, y, px, py;
ans = don = dx = dy = px = py = 0;
scanf("%d", &n);
for(i = 0; i < n; i ++)
{
scanf("%d%d", &dx, &dy);
x = px + dx, y = py + dy;
don += gcd(abs(dx), abs(dy));
ans += det(px, py, x, y);
px = x, py = y;
}
ans = ans < 0 ? -ans : ans;
din = (ans - don) / 2 + 1;
if(ans % 2)
printf("%lld %lld %lld.5\n", din, don, ans / 2);
else
printf("%lld %lld %lld.0\n", din, don, ans / 2);
}
int main()
{
int t, tt;
scanf("%d", &t);
for(tt = 0; tt < t; tt ++)
{
printf("Scenario #%d:\n", tt + 1);
solve();
printf("\n");
}
return 0;
}


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