题目链接: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); } }