zoukankan      html  css  js  c++  java
  • 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:
    ",i);
            printf("%d %d %.1f
    
    ",n,b,s/2);
        }
        return 0;
    }
    


  • 相关阅读:
    swift 学习笔记
    collection view 开发笔记
    代码片段
    childViewController 小计
    iOS 二维码扫描
    statusbarhidden stuff 状态栏的各种特性
    AFNetworking 3.0 断点续传 使用记录
    scrollview 图片放大 捏合 瓦片地图 相关注意事项
    iOS 9 强制横屏
    简单的JS运动封装实例---侧栏分享到
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/6707086.html
Copyright © 2011-2022 走看看