题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1705
解题思路:
叉积求公式+皮克定理(2*S=2*a+b-1)+化二元一次方程根据斜率k求整数解。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mx = 1e6 + 10;
int x[5],y[5];
double area(){
int ans = 0;
int x1 = x[1]-x[0],x2 = x[2] - x[0];
int y1 = y[1]-y[0],y2 = y[2] - y[0];
return fabs(1.0*(x1*y2-x2*y1)/2);
}
int main(){
while(true){
int ok = 0;
for(int i=0;i<3;i++){
scanf("%d%d",x+i,y+i);
if(x[i]||y[i]) ok = 1;
}
if(!ok) break;
int c = 0;
for(int i=0;i<3;i++){
for(int j=i+1;j<3;j++){
if(x[i]==x[j]) c += abs(y[i]-y[j]);
else if(y[i]==y[j]) c += abs(x[i]-x[j]);
else{
int a = abs(x[i]-x[j]),b = abs(y[i]-y[j]);
a /= __gcd(a,b);
c += abs(x[i]-x[j]) / a;
}
}
}
double s = area();
printf("%d\n",int(s-1.0*c/2+1));
}
return 0;
}