http://poj.org/problem?id=1265
pick定理
对于方格点形成多边形
面积=(内点)+(边上点/2)-1
线段边上点数为(两点横坐标距离,两点纵坐标距离)的最大公约数 再加一
对于本题来说 再加一的话 到最后还得剪掉 因为会重复计算 所以直接不加一就可以
面积的求法 就是把多边形分割成多个三角形 需要自己动手画画
#include
<iostream> #include<cmath> #include<string> #include<algorithm> #include<cstring> #include<cstdio> using namespace std; const int N=105; structnode { int x,y; }mem[N]; int gcd(int x,int y) { if(y==0) return x; return gcd(y,x%y); } int main() { int T; cin>>T; for(int w=1;w<=T;++w) { int n; cin>>n; for(int i=0;i<n;++i) { cin>>mem[i].x>>mem[i].y; if(i) { mem[i].x+=mem[i-1].x; mem[i].y+=mem[i-1].y; } } mem[n].x=mem[0].x; mem[n].y=mem[0].y; double sum=0.0; int sidepointsum=0; for(int i=0;i<n;++i) { sum=sum+(mem[i].x*mem[i+1].y-mem[i+1].x*mem[i].y); sidepointsum+=gcd(abs(mem[i].x-mem[i+1].x),abs(mem[i].y-mem[i+1].y)); } sum=sum/2.0; printf("Scenario #%d:\n",w); printf("%d %d %.1f\n\n",((int)(sum)+1)-sidepointsum/2,sidepointsum,sum); } return 0; }
posted on 2012-05-09 21:42  夜->  阅读(163)  评论(0编辑  收藏  举报