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

猜你喜欢

转载自www.cnblogs.com/xiaobuxie/p/11581754.html