Description
Input
Output
Sample Input
2 4 1 0 0 1 -1 0 0 -1 7 5 0 1 3 -2 2 -1 0 0 -3 -3 1 0 -3
Sample Output
Scenario #1: 0 4 1.0 Scenario #2: 12 16 19.0
题意:从原点出发,给出一些dx,dy移动增量,最终形成一个多边形,求多边形内部的格点数目,边上的格点数目 ,以及面积。
Pick定理:一个计算点阵中顶点在格点上的多边形面积公式:S=a+b÷2-1,其中a表示多边形内部的点数,b表示多边形边界上的点数,s表示多边形的面积。
求两点之间的格点数= gcd(abs(x2-x1),abs(y2-y1))
1 #include <iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 using namespace std; 5 int gcd(int a,int b) 6 { 7 return b?gcd(b,a%b):a; 8 } 9 int main() 10 { 11 int n,m,x1,y1,x2,y2; 12 int a,b,A,B,S; 13 int k=1; 14 scanf("%d",&n); 15 while(n--) 16 { 17 x1=x2=y1=y2=A=B=S=0; 18 scanf("%d",&m); 19 while(m--) 20 { 21 scanf("%d%d",&a,&b); 22 x2=x1+a; 23 y2=y1+b; 24 B+=gcd(abs(a),abs(b)); 25 S+=x1*y2-x2*y1; 26 x1=x2; 27 y1=y2; 28 } 29 A=(S+2-B)/2; 30 printf("Scenario #%d:\n",k++); 31 printf("%d %d %.1lf\n\n",A,B,S/2.0); 32 } 33 return 0; 34 }
原文:http://www.cnblogs.com/cxbky/p/4841867.html