POJ 2954 Triangle(求整顶点多边形包含的整点数)
来源:互联网 发布:不倒翁沙袋淘宝 编辑:程序博客网 时间:2024/06/05 02:33
POJ 2954 Triangle(求整顶点多边形包含的整点数)
http://poj.org/problem?id=2954
题意:
给你一个由3个整点构成的三角形,要你求出该三角形内部的整点个数.
分析:
由Pick定理,一个多边形如果每个顶点都由整点构成,该多边形的面积为S,该多边形边上的整点为L,内部的整点为N,则有:
N+L/2-1=S.
那么我们只要求出该三角形的面积和三角形边上到底有多少个整点即可. 面积直接用叉积求.下面求三角形各边上有多少个整点.
假设有一条由两个整点构成的线段,该线段该线段X方向的增量绝对值为DX, Y方向的增量绝对值为DY. 设线段内部(不含端点)整点个数为ans:
DX==DY==0时, ans=0
DX==0时, ans=DY-1(等价于gcd(DX,DY)-1 )
DY==0时, ans=DX-1 (等价于gcd(DX,DY)-1 )
DX!=0且DY!=0时, ans=gcd(DX,DY)-1
简单说明一下上面结论:
端点是整点的线段内部如果有整点, 那线段一定是被内部的整点均匀分割的.
假设线段内部有5个整点(这5个整点一定是均匀排列的),那么包括两端点共7个整点,线段被分成了6等份. 其实就是DX和DY分别被分成了6等份,那么说明DX和DY的最大公约数==6. 如果DX与DY的最大公约数==8,那么线段一定且最多能被分成8等份,且由于线段端点是整点,所以8等份的每个点都是整点.
AC代码:
#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;struct Point{ double x,y; Point(){} Point(double x,double y):x(x),y(y){}};typedef Point Vector;Vector operator-(Point A,Point B){ return Vector(A.x-B.x,A.y-B.y);}double Cross(Vector A,Vector B){ return A.x*B.y-A.y*B.x;}double Area(Point A,Point B,Point C){ return fabs(Cross(A-B,B-C))/2;}int gcd(int a,int b){ return b==0?a:gcd(b,a%b);}int get_segment_point(Point A,Point B)//返回整点构成的线段内部的整点数{ int dx=fabs(A.x-B.x),dy=fabs(A.y-B.y); if(dx==0 && dy==0) return 0; return gcd(dx,dy)-1;}int main(){ int x1,y1,x2,y2,x3,y3; while(scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3)==6) { if(x1==0&&y1==0&&x2==0&&y2==0&&x3==0&&y3==0) break; Point A(x1,y1),B(x2,y2),C(x3,y3); int S=Area(A,B,C);//面积 int L=3+get_segment_point(A,B)+get_segment_point(B,C)+get_segment_point(A,C);//边整点 printf("%d\n",S+1-L/2); } return 0;}
0 0
- POJ 2954 Triangle(求整顶点多边形包含的整点数)
- POJ 1265 (Pick 公式+求任意多边形面积+顶点多边形的边整点个数)
- UVA 10088 Trees on My Island(求整顶点多边形内部整点数)
- POJ 2954 Triangle(pick定理,边上整点数)
- 已知多边形各顶点的坐标,求多边形面积
- 多边形的边数(当然也是顶点数)
- 求含n个顶点的多边形面积
- 已知任意一个多边形的各个顶点的坐标,怎么去求该多边形的面积?
- 已知多边形的顶点坐标(x,y),求多边形的面积
- ZOJ1032-Area 2(已知点坐标求多边形面积,求线段上的整点数量,pick定理)
- 已知多边形顶点坐标求面积
- 根据各顶点坐标求多边形面积
- poj-3130-3335-求多边形的核
- POJ 1654 Area 求多边形的面积
- 圆内接多边形的所有顶点
- 求椭圆曲线上的整点
- 求阶乘数包含0的个数
- poj 3907 求多边形面积
- JavaIO总结Demo大全(3)
- ble学习笔记二-----------------点亮led
- JavaIO总结Demo大全(2)
- Newtonsoft将对象或对象集合转换成JSON数据时,日期格式的设置
- RGB通过转换成HSV增加明度和饱和度
- POJ 2954 Triangle(求整顶点多边形包含的整点数)
- 模仿细胞的分裂--彩图,动态
- 记一次修改linux键盘映射的过程
- 最长公共子序列——NYOJ 36
- fir 提交的版本的iPhone4 iPhone4S不能安装 iPhone5 5s padAir可以安装解决方案
- 2015华为机试题整理
- UIView animate动画的写法
- ble学习笔记三---------------------------控制led
- ble学习笔记四---------------------控制lcd