题意:
给出一个顶点在格点上的多边形,顶点逆时针给出;
求1.多边形内部格点数,2.多边形边上格点数,3.多边形面积;
题解:
本题问题顺序与难度无关!
看完了pick定理之后,我猜测是用前两个格点数求出图形面积!
然后我特么就傻x了!
真相其实还是用叉积来求面积。。。
然后记录边上的格点数,也就是边这个向量的gcd(x,y)
注意x,y应该取绝对值,否则求出来一个负数岂不是逗;
x是0返回y就好,y同理(我这里写挂是有多弱);
然后上pick定理求解第一问就可以了;
代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int gcd(int a,int b) { if(!a||!b) return a?a:b; int t=a%b; while(t) { a=b,b=t; t=a%b; } return b; } struct Point { int x,y; void read() { scanf("%d%d",&x,&y); } friend Point operator +(Point a,Point b) { Point temp; temp.x=a.x+b.x,temp.y=a.y+b.y; return temp; } friend Point operator -(Point a,Point b) { Point temp; temp.x=a.x-b.x,temp.y=a.y-b.y; return temp; } friend int operator ^(Point a,Point b) { return a.x*b.y-a.y*b.x; } friend int dis(Point a) { return gcd(abs(a.x),abs(a.y)); } }st,t,last; int main() { int c,T,n,i,j,k,cnt,S; scanf("%d",&T); for(c=1;c<=T;c++) { scanf("%d",&n); S=cnt=0; st.read(); last=st; for(i=1;i<n;i++) { t.read(); t=t+last; S+=last^t; cnt+=dis(t-last); last=t; } S+=t^st; cnt+=dis(st-t); printf("Scenario #%d:\n",c); printf("%d %d %d.%d\n\n",S+2-cnt>>1,cnt,S>>1,S&1?5:0); } return 0; }
原文地址:http://blog.csdn.net/ww140142/article/details/47174145