题意:给你一些点,但是这些点并不是坐标,而是记录路径的点,例如(-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; }