今 天上acm,掌握的不好,写这篇的时候觉得很不好意思,因为这是别人做的,我只是在理解,他大体的思路和我一样,可是我却老是wrong answer。。。伤感啊~~Triangle
这题是学长教我们的,不过我做的不好,这题是pick定理的应用:pick定理就是A=i+d/2-1;(A:表示的是面积,i:落在网格的点的个数,d:是落在线上的点的个数)。
思路:先求出三角形的面积,已知三角形的三点求面积:s=x0*y1+x1*y2+x2*y0-x1*y0-x2*y1-x0*y2;再求落在边上的整点,用求两个数之间差值的最大公约数的方法求出落在边上的点,结果是i=A+1-d/2;
这是我上网搜到的,参考别人的,现在,我知道了最好的方法就是自定义函数,自定义函数可以分块调用,减少错误:
#include<stdio.h>
#include<math.h>
int x[3],y[3];
int gys(int a,int b)
{
if(a==0)
return b;
if(b==0)
return a;
if(a>=b)
return gys(b,a%b);
else
return gys(a,b%a);//求最大公约数的自定义函数;
}
int p(int a)
{
if(a<0)
a=-a;
return a;//负数变正数。
}
int main()
{
int b,s,i;
while(scanf("%d%d%d%d%d%d",&x[0],&y[0],&x[1],&y[1],&x[2],&y[2])!=EOF)
{
if(x[0]==0&&y[0]==0&&x[1]==0&&y[1]==0&&x[2]==0&&y[2]==0)
break;
s=x[0]*y[1]+x[1]*y[2]+x[2]*y[0]-x[1]*y[0]-x[2]*y[1]-x[0]*y[2];
if(s<0)
s=-s;
b=gys(p(x[0]-x[1]),p(y[0]-y[1]))+gys(p(x[1]-x[2]),p(y[1]-y[2]))+gys(p(x[2]-x[0]),p(y[2]-y[0]));
i=1+(s-b)/2;
printf("%d\n",i);
}
}