pick定理:面积=内部点数+边上点数/2 -1;
开始做的时候脑袋发昏,敲了一个小时的模版,枚举点判断与多边形位置,果断TLE
等脑子清醒了,多画了几个图,数了几次点,就A了。。
//Memory: 180K
//Time: 0MS
#include <stdio.h>
#include <math.h>
struct POINT
{
int x,y;
};POINT p[110];
int gcd(int a,int b)
{
if(b==0)
return a;
return gcd(b,a%b);
}
double area_of_polygon(int n)//多边形面积
{
int i;
double s;
// if(n<3)
// return 0;
s=p[0].y*(p[n-1].x-p[1].x);
for(i=1;i<n;i++)
s+=p[i].y*(p[i-1].x-p[(i+1)%n].x);
return s/2;
}
int main()
{
int cas,i,j,n;
scanf("%d",&cas);
for(int f=1;f<=cas;f++)
{
scanf("%d",&n);
p[0].x=0;
p[0].y=0;
int dx,dy,on=0,in=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&dx,&dy);
p[i].x=p[i-1].x+dx;
p[i].y=p[i-1].y+dy;
if(dx==0 || dy==0)
on+=abs(dx+dy);
else
on+=gcd(abs(dx),abs(dy));
}
double area=area_of_polygon(n);
in=area+1-on*1.0/2;
printf("Scenario #%d:\n",f);
printf("%d %d %.1lf\n\n",in,on,area);
}
return 0;
}