poj 1265 Area( pick 定理 )
题目:http://poj.org/problem?id=1265
题意:已知机器人行走步数及每一步的坐标 变化量 ,求机器人所走路径围成的多边形的面积、多边形边上和内部的点的数量。
思路:1.以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其中,dxdy分别为线段横向占的点数和纵向占的点数。如果dx或dy为0,则覆盖的点数为dy或dx。
2.Pick公式:平面上以格子点为顶点的简单多边形,如果边上的点数为on,内部的点数为in,则它的面积为A=on/2+in-1。
3.任意一个多边形的面积等于按顺序求相邻两个点与原点组成的向量的叉积之和(黑书上有说明) 应该是面积的 2倍
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 6 int gcd(int a,int b) 7 { 8 int r; 9 while(b!=0) 10 { 11 r=b; b=a%b; a=r; 12 } 13 return a; 14 } 15 int main() 16 { 17 int t,n,i,x[110],y[110],dx,dy; 18 int in,on; 19 double area; 20 cin>>t; 21 for(int k=1; k<=t; k++) 22 { 23 in=0; on=0; area=0.0; 24 cin>>n; 25 x[0]=y[0]=0; 26 for(i=1; i<=n; i++) 27 { 28 cin>>dx>>dy; 29 x[i]=x[i-1]+dx; 30 y[i]=y[i-1]+dy; 31 area+=x[i-1]*y[i]-x[i]*y[i-1]; //这里求的area是 实际面积的两倍 32 on+=gcd(abs(dx),abs(dy)); 33 } 34 in=area/2+1-on/2; 35 printf("Scenario #%d:\n",k); 36 printf("%d %d %.1lf\n\n",in,on,area/2); 37 } 38 return 0; 39 }