poj 1265 Area(pick 定理)
阿新 • • 發佈:2017-05-28
clu mod href 格子 .org ble gb2312 gb2 col
鏈接:poj 1265
題意:從原點出發,給出一些dx,dy移動增量,終於形成一個多邊形,
求多邊形內部的格點數目,邊上的格點數目 ,以及面積。
補充知識:
1、以格子點為頂點的線段。覆蓋的點的個數為gcd(|dx|,|dy|),當中,|dx|,|dy|分別為線段橫向增量和縱向增量。
2、Pick定理:設平面上以格子點為頂點的多邊形的內部點個數為a。邊上點個數為b,面積為S,則 S = a + b/2 -1.
3、隨意一個多邊形的面積等於以多邊形邊上的某點為固定點,按順序求其余點相鄰兩個點與該點組成的向量的叉積之和的一半。本題都是從原點出發,能夠都以原點為固定點。
思路:由於每一步的dx,dy已知,運用上述知識先求出邊上點的個數,以及多邊形面積,則內部點就可求出了
註:不要每算一次面積就取絕對值,要求叉積的累加和的絕對值
#include<stdio.h> #include<stdlib.h> int chaji(int x1,int y1,int x2,int y2) { return x1*y2-x2*y1; } int gcd(int a,int b) { return b==0?a:gcd(b,a%b); } int main() { int T,m,i,j,dx,dy,n,b,x,y; float s; scanf("%d",&T); for(i=1;i<=T;i++){ scanf("%d",&m); scanf("%d%d",&x,&y); b=gcd(abs(x),abs(y)); s=0; for(j=2;j<=m;j++){ scanf("%d%d",&dx,&dy); b+=gcd(abs(dx),abs(dy)); s+=chaji(x,y,x+dx,y+dy); x+=dx; y+=dy; } if(s<0) s=-s; n=(s+2-b)/2; printf("Scenario #%d:\n",i); printf("%d %d %.1f\n\n",n,b,s/2); } return 0; }
poj 1265 Area(pick 定理)