poj 1265 Area(pick 定理)

其实完全没想做这题的,因为不想这个时候在花些时间学习新的方法,但是打开了这道题就想把它做出来,像是一种本能吧。以前从没听过pick 定理,更何谈用它做题,所以只能上网搜了一些关于它的讲解,发现其实很简单,就是一个公式:

Pick 定理   设以整数点为顶点的多边形的面积为S,多边形内部的整数点数为N,多边形边界上的整数点数为L,则   N+1/2L-1=S.

但往往越是简单的公式,推导过程越是复杂。看了一下维基百科上的证明,感觉不是很详细,但是他下面有给出的外部链接,其中有一篇全是繁体字的,偶然搜到一篇博客,上面有这篇文章的简体翻译,简要看了一下,没细研究,留下链接,以后有时间慢慢专研吧。
http://translate.google.com/translate?u=http://episte.math.ntu.edu.tw/articles/sm/sm_25_10_1/page4.html&hl=zh-CN&ie=UTF8&sl=zh-TW&tl=zh-CN

恩,接下来说一下1265题,题目不是给出m的点,而是给出每个点在

x轴和y轴的距离,也就是每次都要加上求一个点的坐标才是它的自己的坐标,刚开始读题的时候没弄清楚,WA了两次,然后就是套模板了,

给出代码:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

struct node
{
    int x;
    int y;
}p[105];

int edge , inside ;
double  s ;

int gcd ( int a , int b )
{
    if ( b == 0 )
    return a;
    else return gcd ( b , a%b );
}

int edgenum(int n )
{
     int i,ret=0;
     for(i = 1 ; i <= n ; i++)
          ret+=gcd(abs(p[i].x-p[(i+1)%n].x),abs(p[i].y-p[(i+1)%n].y));
     return ret;
}

int area( int n )
{
    int i;
    s=0;
    for(i = 1 ; i <= n ; i++) s+=p[(i+1)%n].y*(p[i].x-p[(i+2)%n].x);
    return (fabs( s )- edge )/2 +1;
}

int main()
{
    int cas , i , j , n , x , y ;

    scanf ( "%d" , &cas );
    for ( j = 1 ; j <= cas ; j++ )
    {
        scanf ( "%d", &n );
        x = y = 0 ;
        p[0].x = p[0].y = 0;
        for ( i = 1 ; i <= n ; i++)
        {
            scanf ( "%d%d" , &x , &y);
            p[i].x = p[i-1].x + x;
            p[i].y = p[i-1].y + y;
        }
        edge = edgenum ( n );
        inside = area ( n );
        printf ( "Scenario #%d:\n" , j );
        printf ( "%d %d %.1lf\n\n" , inside , edge , fabs(s)/2.0 );
    }
    return 0;
}
原文地址:https://www.cnblogs.com/misty1/p/2490655.html