Area

题目链接:https://vjudge.net/problem/POJ-1265

题意:机器人刚开始在原点,然后有n次指令,每次指令机器人的坐标会变成(x,y),机器人是按直线走到下一个点,第n次指令后,机器人会回到原点,机器人的路径是一个凸多边形,要你求这个凸多边形内的整点数,边上的点数,以及面积。

思路:对于一个凸多边形的面积可以用差积来求。以整点为顶点的线段,覆盖的点的个数为 gcd(dx,dy),其中dx,dy分别为线段横向占的点数和纵向占的点数。如果 dx或 dy为0 ,则覆盖的点数为 xy或dx。然后凸多边行内的整数点可以根据pick定理来求。

pick定理:S=x+d/2-1;S是多边形的面积,x是内部的整数点,d是边上的整数点。

#include<bits/stdc++.h>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
    int x,y;
}a[205];
int chaj(int x1,int y1,int x2,int y2)
{
    return x1*y2-x2*y1;
}
int gcd(int x,int y)
{
    while(y)
    {
        int z=x%y;
        x=y;
        y=z;
    }
    return x;
}
int main()
{
    int t,u=0;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        a[0].x=a[0].y=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i].x>>a[i].y;
            a[i].x+=a[i-1].x;
            a[i].y+=a[i-1].y;
        }
        int ans=0;
        for(int i=1;i<=n;i++)
            ans+=chaj(a[i-1].x,a[i-1].y,a[i].x,a[i].y);
        ans=abs(ans);
        int sum=0;
        for(int i=1;i<=n;i++)
            sum+=gcd(abs(a[i].x-a[i-1].x),abs(a[i].y-a[i-1].y));
        //sum+=gcd(abs(a[n].x-a[1].x),abs(a[n].y-a[1].y));
        int x=ans+2-sum;
        x/=2;
        double s=ans/2.0;
        printf("Scenario #%d:\n",++u);
        printf("%d %d %.1lf\n\n",x,sum,s);
    }
}

 

posted @ 2020-10-07 21:43  ~zcb  阅读(256)  评论(0编辑  收藏  举报