poj 1265 Area(pick 定理)

Posted jzssuanfa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj 1265 Area(pick 定理)相关的知识,希望对你有一定的参考价值。

链接:poj 1265

题意:从原点出发,给出一些dx,dy移动增量,终于形成一个多边形,

求多边形内部的格点数目,边上的格点数目 ,以及面积。

补充知识

1、以格子点为顶点的线段。覆盖的点的个数为gcd(|dx|,|dy|),当中,|dx|,|dy|分别为线段横向增量和纵向增量。
2、Pick定理:设平面上以格子点为顶点的多边形的内部点个数为a。边上点个数为b,面积为S,
S = a + b/2 -1.

3、随意一个多边形的面积等于以多边形边上的某点为固定点,按顺序求其余点相邻两个点与该点组成的向量的叉积之和的一半。本题都是从原点出发,能够都以原点为固定点。

思路:由于每一步的dx,dy已知,运用上述知识先求出边上点的个数,以及多边形面积,则内部点就可求出了

:不要每算一次面积就取绝对值,要求叉积的累加和的绝对值

#include<stdio.h>
#include<stdlib.h>
int chaji(int x1,int y1,int x2,int y2)
{
    return x1*y2-x2*y1;
}
int gcd(int a,int b)
{
    return b==0?a:gcd(b,a%b);
}
int main()
{
    int T,m,i,j,dx,dy,n,b,x,y;
    float s;
    scanf("%d",&T);
    for(i=1;i<=T;i++){
        scanf("%d",&m);
        scanf("%d%d",&x,&y);
        b=gcd(abs(x),abs(y));
        s=0;
        for(j=2;j<=m;j++){
            scanf("%d%d",&dx,&dy);
            b+=gcd(abs(dx),abs(dy));
            s+=chaji(x,y,x+dx,y+dy);
            x+=dx;
            y+=dy;
        }
        if(s<0)
            s=-s;
        n=(s+2-b)/2;
        printf("Scenario #%d:\n",i);
        printf("%d %d %.1f\n\n",n,b,s/2);
    }
    return 0;
}


以上是关于poj 1265 Area(pick 定理)的主要内容,如果未能解决你的问题,请参考以下文章

poj 1265 Area(pick 定理)

poj 1265 Area(pick 定理)

POJ 1265:Area

POJ 1265 Area

poj 1265 Area 面积+多边形内点数

模板计几皮克定理 poj1265