POJ 1265 Area (简单多边形求面积+pick公式)

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;
}


你可能感兴趣的:(POJ 1265 Area (简单多边形求面积+pick公式))