• 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:
    ",++u);
            printf("%d %d %.1lf
    
    ",x,sum,s);
        }
    }
  • 相关阅读:
    第九周学习报告
    人月神话阅读笔记02
    数组 分步 详细
    第八周学习总结
    课堂练习
    学习进度报告09
    用户模板和用户场景
    学习进度报告08
    课堂随笔
    学习进度报告07
  • 原文地址:https://www.cnblogs.com/zcb123456789/p/13779456.html
Copyright © 2020-2023  润新知