zoukankan      html  css  js  c++  java
  • poj Area 1265 求面积+ 多边形边上的点的个数+ 多边形内点个数

    题目来源:

    http://poj.org/problem?id=1265

    分析:

    1:pick公式:多边形的面积=多边形边上的格点数目/2+多边形内部的格点数目-1。

    即 Area = E/2 + I -1;

    2:

    我们可以利用叉积求出 面积 Area。

    3:

    多边形边上的点数目为:

    dx = p[i] .x - p[i-1].x;

    dy = p[i].y - p[i-1].y ;

    p[i - 1][ i] 这条线段上的 点个数为

    gcd( |dx|, |dy| ) +1

    代码如下:

    typedef long long LL ;
    const double EPS = 1e-12;
    const int Max_N = 305;
    int n;
    struct Point{
        int x,y;
    };
    int xmult(Point p1, Point p2){
        return p1.x *p2.y  - p1.y *p2.x;
    }
    Point p[Max_N];
    int gcd(int a,int b){
        return b==0 ? a:gcd(b, a%b);
    }
    int main(){
        int t,x,y,k=1;
        int E,I;
        scanf("%d",&t);
        while(t--){
            E=0;
            I=0;
            scanf("%d",&n);
            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;
                x=x<0 ? -x : x;
                y=y<0 ? -y : y;
                E += gcd(x,y);
            }
            int sum=0;
            for(int i=0; i<n; i++)
                sum += xmult(p[i],p[i+1]);
            if(sum < 0) sum = -sum;
            I=(sum + 2 - E) / 2;
            printf("Scenario #%d:
    ",k++);
            printf("%d %d %.1f
    
    ",I,E,(double)sum/2.0);
        }
        return 0;
    }
  • 相关阅读:
    Java基础--第二十六天
    Java基础--第二十五天
    Java基础--第二十四天
    Java基础--第二十三天
    Java基础--第二十二天
    Java基础--第二十一天
    Java基础--第二十天
    Java基础--第十九天
    Java基础总结--待续
    docker学习笔记
  • 原文地址:https://www.cnblogs.com/zn505119020/p/3671442.html
Copyright © 2011-2022 走看看