POJ 1265 Area(计算几何--网格)

博客原文地址:http://blog.csdn.net/xuechelingxiao/article/details/39159863


Area


题目大意:给出每个点相对于前一个点的坐标增量,增量都是整数,会得到一个在网格上多边形,求多边形内的格点、多边形上的格点以及多边形的面积。


解题思路:这个题主要是Pick定理的应用(Pick定理传送门),另外还有几个其他的知识点。

Pick定理:平面上以格子点为顶点的简单多边形的面积=边上的点数/2+内部的点数+1。

计算多边形边上的格点数目:Σ ( GCD ( abs(dx),  abs(dy)) )  dx是每个点相对于前一个点的x的增量, dy是每个点相对于前一个点的y的增量。


代码如下:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

struct Point {
    int x, y;
} P[105];

int gcd(int a, int b){
    return b?gcd(b, a%b):a;
}

int main()
{
    int n;
    int x, y;
    int T, icase = 1;
    scanf("%d", &T);
    while(T--) {
        scanf("%d", &n);
        double area = 0;
        int sum = 0;
        P[0].x = P[0].y = 0;
        for(int i = 1; i <= n; ++i) {
            scanf("%d%d", &x, &y);
            P[i].x = P[i-1].x+x;
            P[i].y = P[i-1].y+y;
            area += P[i].x*P[i-1].y-P[i].y*P[i-1].x;
            sum += gcd(abs(x), abs(y));
        }
        area = fabs(area*0.5);
        printf("Scenario #%d:\n", icase++);
        printf("%.0lf %d %.1lf\n\n", (area*2-sum+2)/2, sum, area);
    }

    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值