您的位置:首页 > 其它

poj 1265 Area(pick 定理)

2012-05-08 20:10 453 查看
其实完全没想做这题的,因为不想这个时候在花些时间学习新的方法,但是打开了这道题就想把它做出来,像是一种本能吧。以前从没听过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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: