题意:给定三个整数坐标点作为三角形的三个顶点,求在此三角形内部的点的数量。
思路:Pick(皮克)公式:平面上以格子点为顶点的简单多边形,如果边上的点数为on,内部的点数为in,则它的面积为area=on/2+in-1。可以用归纳法进行证明。
有一个技巧就是利用gcd求每个边上的整数点数:即一条线段(端点都是整数坐标)上的整数点数-1是端点横坐标之差的绝对值和纵坐标之差绝对值的最大公约数。比较巧妙。
#include <cstdio>
#include <cstdlib>
using namespace std;
struct point{
int x,y;
}p[3];
int area,num;
int compute_area(){
int x1,x2,y1,y2;
x1 = p[1].x-p[0].x;
y1 = p[1].y-p[0].y;
x2 = p[2].x-p[0].x;
y2 = p[2].y-p[0].y;
return abs(x1*y2-x2*y1);
}
int gcd(int x,int y){
if(!y)
return x;
return gcd(y,x%y);
}
int p_online(){
int i,res=0;
for(i = 0;i<3;i++)
res += gcd(abs(p[i].x-p[(i+1)%3].x),abs(p[i].y-p[(i+1)%3].y));
return res;
}
int main(){
while(1){
int i,flag = 0;
for(i = 0;i<3;i++){
scanf("%d %d",&p[i].x,&p[i].y);
if(p[i].x || p[i].y)
flag = 1;
}
if(!flag)
break;
area = compute_area();
num = p_online();
printf("%d\n",(area-num)/2+1);
}
return 0;
}