题目链接:点击打开链接
给定一个三角形三点坐标,问三角形内有多少个坐标均为整数的点。
运用皮克定理:多边形面积=内部整数点数a+边上的整数点数b/2-1。
三角形两向量叉积/2=面积。
向量上整数点数为gcd(v.x,v.y)(此公式对于一条边上的结果不准确,但是三条边加在一起的和是准确的)
求出这两个一减就是结果了。
之前先不把面积及边上点数除2,最后一起除可保证均为整数运算。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#define ABS(x) x>0?x:-x
using namespace std;
int gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);
}
struct point{
int x,y;
point(){}
point(int x,int y):x(x),y(y){}
point operator-(point obj){
return point(x-obj.x,y-obj.y);
}
};
typedef point Vector;
int cross(Vector a,Vector b){
return a.x*b.y-b.x*a.y;
}
Vector p[4];
int main(){
while(~scanf("%d%d%d%d%d%d",&p[1].x,&p[1].y,&p[2].x,&p[2].y,&p[3].x,&p[3].y)){
if(!p[1].x&&!p[1].y&&!p[2].x&&!p[2].y&&!p[3].x&&!p[3].y) break;
int b=0;
for(int i=1;i<=3;i++){
point t=p[i+1==4?1:i+1]-p[i];
b+=gcd(ABS(t.x),ABS(t.y));
}
int s=ABS(cross(p[3]-p[1],p[2]-p[1]));
int res=(s-b+2)/2;
printf("%d\n",res);
}
return 0;
}