码迷,mamicode.com
首页 > 其他好文 > 详细

poj-1265 Area

时间:2015-07-31 20:23:13      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:poj   计算几何   pick定理   

题意:

给出一个顶点在格点上的多边形,顶点逆时针给出;

求1.多边形内部格点数,2.多边形边上格点数,3.多边形面积;


题解:
本题问题顺序与难度无关!

看完了pick定理之后,我猜测是用前两个格点数求出图形面积!

然后我特么就傻x了!

真相其实还是用叉积来求面积。。。

然后记录边上的格点数,也就是边这个向量的gcd(x,y)

注意x,y应该取绝对值,否则求出来一个负数岂不是逗;

x是0返回y就好,y同理(我这里写挂是有多弱)

然后上pick定理求解第一问就可以了;


代码:


#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int gcd(int a,int b)
{
	if(!a||!b)	return a?a:b;
	int t=a%b;
	while(t)
	{
		a=b,b=t;
		t=a%b;
	}
	return b;
}
struct Point
{
	int x,y;
	void read()
	{
		scanf("%d%d",&x,&y);
	}
	friend Point operator +(Point a,Point b)
	{
		Point temp;
		temp.x=a.x+b.x,temp.y=a.y+b.y;
		return temp;
	}
	friend Point operator -(Point a,Point b)
	{
		Point temp;
		temp.x=a.x-b.x,temp.y=a.y-b.y;
		return temp;
	}
	friend int operator ^(Point a,Point b)
	{
		return a.x*b.y-a.y*b.x;
	}
	friend int dis(Point a)
	{
		return gcd(abs(a.x),abs(a.y));
	}
}st,t,last;
int main()
{
	int c,T,n,i,j,k,cnt,S;
	scanf("%d",&T);
	for(c=1;c<=T;c++)
	{
		scanf("%d",&n);
		S=cnt=0;
		st.read();
		last=st;
		for(i=1;i<n;i++)
		{
			t.read();
			t=t+last;
			S+=last^t;
			cnt+=dis(t-last);
			last=t;
		}
		S+=t^st;
		cnt+=dis(st-t);
		printf("Scenario #%d:\n",c);
		printf("%d %d %d.%d\n\n",S+2-cnt>>1,cnt,S>>1,S&1?5:0);
	}
	return 0;
}



poj-1265 Area

标签:poj   计算几何   pick定理   

原文地址:http://blog.csdn.net/ww140142/article/details/47174145

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!