51nod 3149 Triangle
皮克定理是指一个计算点阵中顶点在格点上的多边形面积公式,该公式可以表示为S=a+b/2-1,其中a表示多边形内部的点数,b表示多边形落在格点边界上的点数,S表示多边形的面积。
所以只需要求出来面积和边界的点数。
求一条边上的整点的个数__gcd(abs(x1-x2),abs(y1-y2))+1.
因为三角形在计算3个边的时候会有重复的端点被计算所以要减去3.
这个题在51nod后面的数据是错误的..
#include<bits/stdc++.h> #define fp(i,a,b) for(int i=a;i<=b;i++) typedef long long ll; typedef double dl; using namespace std; const int maxn=2e5+7; const ll M=1e9+7; const int INF=0x3f3f3f3f; int n,m; int x1,y1,x2,y2,x3,y3; double dis(int x1,int y1,int x2,int y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } void solve() { int a=0;//a是边上的点. int b; b=__gcd(abs(x1-x2),abs(y1-y2))+__gcd(abs(x1-x3),abs(y1-y3))+__gcd(abs(x2-x3),abs(y2-y3)); //printf("a:%d\n",b); double p; int s; s=(x1*y2+x3*y1+x2*y3-x3*y2-x2*y1-x1*y3)/2;//三角形面积 //printf("s:%lf\n",s); s=abs(s); s++; a=s-b/2; printf("%d\n",a); } int main() { //ios::sync_with_stdio(0); //cin.tie(0),cout.tie(0); //int T; scanf("%d",&T) //for(int i=1;i<=T;i++) while(scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3)!=EOF) { if(x1==0&&x2==0&&x3==0&&y1==0&&y2==0&&y3==0) return 0; solve(); } return 0; }