模板计几皮克定理 poj1265
Posted xiaobuxie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模板计几皮克定理 poj1265相关的知识,希望对你有一定的参考价值。
题目链接:https://vjudge.net/problem/POJ-1265
题意:在整点网格中给你若干个点,输出围成的面积还有边上的点还有内部(不包括边的点)。
这题为了普遍性做模板,所以就直接把所有点存下来了。皮克定理看注释吧
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const int N=106; 7 struct Point 8 int x,y; 9 int operator ^ (const Point& b)const 10 return x*b.y-b.x*y; 11 12 p[N]; 13 // 对于Pa(x1,y1),Pb(x2,y2)所连成的选段,经过的格点的个数为Gcd(abs(x1-x2),abs(y1-y2))+1 14 //在求的时候不用 +1,因为左闭右开地求,保证不重 15 16 //皮克定理:一个计算点阵中顶点在格点上的多边形面积公式:S=a+b/2-1 17 //其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积。 18 //s用double,其他用int,b/2是整除 19 int main() 20 int T; scanf("%d",&T); 21 for(int cas=1;cas<=T;++cas) 22 int n; scanf("%d",&n); 23 int dx,dy; 24 p[0]=(Point)0,0; 25 double area=0; 26 int pin=0,pon=0; 27 for(int i=1;i<=n;++i) 28 scanf("%d %d",&dx,&dy); 29 p[i].x=p[i-1].x+dx; 30 p[i].y=p[i-1].y+dy; 31 32 33 for(int i=0;i<n;++i) 34 area+=p[i]^p[i+1]; 35 pon+=__gcd(abs(p[i+1].y-p[i].y),abs(p[i+1].x-p[i].x)); 36 37 area+=p[n]^p[0]; 38 area=fabs(area)/2; 39 pon+=__gcd(abs(p[0].y-p[n].y),abs(p[0].x-p[n].x)); 40 pin=(int)(area - pon/2 + 1); 41 printf("Scenario #%d:\n",cas); 42 printf("%d %d %.1f\n",pin,pon,area); 43 puts(""); 44 45
以上是关于模板计几皮克定理 poj1265的主要内容,如果未能解决你的问题,请参考以下文章