模板计几皮克定理 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  
View Code

 

以上是关于模板计几皮克定理 poj1265的主要内容,如果未能解决你的问题,请参考以下文章

poj 1265 Area(Pick定理)

POJ 2954 /// 皮克定理+叉积求三角形面积

poj 1265 Area Pick定理

poj 1265 Area(pick 定理)

poj 1265 Area(pick 定理)

计几模板模板整理