poj-1265 Area

本文探讨了利用Pick定理解决多边形几何问题的方法,包括内部点数、边上点数及面积计算。介绍了如何通过叉积求面积,并记录边上的点数,最后运用Pick定理解答核心问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值