zoukankan      html  css  js  c++  java
  • POJ 1265

    题意:给你一些点,但是这些点并不是坐标,而是记录路径的点,例如(-1,0)代表沿负方向走了一个单位;最终这些点构成一个多边形,求这个多边形内的点和多边形边上的点和多边形的面积。

    设多边形内的点为a,多边形边上的点为b,多边形的面积为S,则:

    多边形边上的点可以用gcd来求,gcd(dx,dy)就是多边形边上的点,dx是线段覆盖的在x方向上的点数,dy是线段覆盖在y方向上的点数;

    多边形的面积可以用叉积来求:多边形的面积等于按照顺时针或者逆时针的方向上相邻的两个点分别与多边形内一点构成的向量的叉积之和的一半。

    pick定理可以求面积:S=a+b/2-1;所以内部的点a=s+1-b/2;

    AC代码(参考网上代码

    #include<iostream>
    #include<queue>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    using namespace std;
    
    struct node
    {
        int x;int y;
    }point[205];
    
    int area(node A,node B)
    {
        return A.x*B.y-A.y*B.x;
    }
    
    int gcd(int a,int b)
    {
        return b?gcd(b,a%b):a;
    }
    
    int main()
    {
        int T,n;
        scanf("%d",&T);
        int f=1;
        while(T--)
        {
            scanf("%d",&n);
            int a=0,p=0;
            point[0].x=0;point[0].y=0;
            for(int i=1;i<=n;i++)
            {
                scanf("%d%d",&point[i].x,&point[i].y);
                int dx=point[i].x;
                if(dx<0)
                {
                    dx=-dx;
                }
                int dy=point[i].y;
                if(dy<0)
                {
                    dy=-dy;
                }
                p+=gcd(dx,dy);
                point[i].x+=point[i-1].x;
                point[i].y+=point[i-1].y;
                a+=area(point[i],point[i-1]);
            }
            if(a<0)
            {
                a=-a;
            }
            printf("Scenario #%d:
    %d %d %.1f
    
    ",f++,(a+2-p)/2,p,0.5*a);
        }
        return 0;
    }
  • 相关阅读:
    ROC曲线
    数学建模的时间表和分工
    找寻子串
    被7整除
    Java中BufferedReader和scanner的对比
    机器学习降维方法
    梯度下降法
    天池大赛
    统一认证系统(三)
    软件设计方案
  • 原文地址:https://www.cnblogs.com/qioalu/p/5202648.html
Copyright © 2011-2022 走看看