首页 > 代码库 > hdu 1705 Count the grid(皮克定理)
hdu 1705 Count the grid(皮克定理)
题目链接:hdu 1705 Count the grid
题意:
给定一个三角形三点坐标,问三角形内有多少个坐标均为整数的点。
题解:
给定顶点坐标均是整点(或正方形格点)的简单多边形,皮克定理说明了其面积 S 和内部
格点数目 n、边上格点数目 s 的关系:S = n +s/2+1
三角形两向量叉积/2=面积。
向量上整数点数为gcd(v.x,v.y)(此公式对于一条边上的结果不准确,但是三条边加在一起的和是准确的)
1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;++i) 3 using namespace std; 4 5 struct point 6 { 7 int x,y; 8 point(){} 9 point(int _x,int _y):x(_x),y(_y){} 10 point operator -(point b){return point(x-b.x,y-b.y);} 11 }p[3]; 12 13 int cross(point a,point b){return a.x*b.y-b.x*a.y;} 14 15 int main() 16 { 17 while(~scanf("%d%d%d%d%d%d",&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y)) 18 { 19 if(!p[0].x&&!p[0].y&&!p[1].x&&!p[1].y&&!p[2].x&&!p[2].y)break; 20 int tmp=0; 21 F(i,0,2) 22 { 23 point t=p[(i+1)%3]-p[i]; 24 tmp+=__gcd(abs(t.x),abs(t.y)); 25 } 26 int s=abs(cross(p[2]-p[0],p[1]-p[0])); 27 printf("%d\n",(s-tmp+2)/2); 28 } 29 return 0; 30 }
hdu 1705 Count the grid(皮克定理)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。