首页 > 代码库 > poj 1265 Area(pick 定理)
poj 1265 Area(pick 定理)
链接:poj 1265
题意:从原点出发,给出一些dx,dy移动增量,最终形成一个多边形,
求多边形内部的格点数目,边上的格点数目 ,以及面积。
补充知识:
1、以格子点为顶点的线段,覆盖的点的个数为gcd(|dx|,|dy|),其中,|dx|,|dy|分别为线段横向增量和纵向增量。
2、Pick定理:设平面上以格子点为顶点的多边形的内部点个数为a,边上点个数为b,面积为S,
则 S = a + b/2 -1.
3、任意一个多边形的面积等于按顺序求相邻两个点与原点组成的向量的叉积之和的一半。
思路:因为每一步的dx,dy已知,运用上述知识先求出边上点的个数,以及多边形面积,则内部点就可求出了
注:不要每算一次面积就取绝对值,要求叉积的累加和的绝对值
#include<stdio.h> #include<stdlib.h> int chaji(int x1,int y1,int x2,int y2) { return x1*y2-x2*y1; } int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { int T,m,i,j,dx,dy,n,b,x,y; float s; scanf("%d",&T); for(i=1;i<=T;i++){ scanf("%d",&m); scanf("%d%d",&x,&y); b=gcd(abs(x),abs(y)); s=0; for(j=2;j<=m;j++){ scanf("%d%d",&dx,&dy); b+=gcd(abs(dx),abs(dy)); s+=chaji(x,y,x+dx,y+dy); x+=dx; y+=dy; } if(s<0) s=-s; n=(s+2-b)/2; printf("Scenario #%d:\n",i); printf("%d %d %.1f\n\n",n,b,s/2); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。