题意:
给出一个顶点在格点上的多边形,顶点逆时针给出;
求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;
}