poj 1265 Area(pick 定理),poj1265

來源:互聯網
上載者:User

poj 1265 Area(pick 定理),poj1265

連結: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;}





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.