链接:http://poj.org/problem?id=1265

Area
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 4969   Accepted: 2231

Description

Being well known for its highly innovative products, Merck would definitely be a good target for industrial espionage. To protect its brand-new research and development facility the company has installed the latest system of surveillance robots patrolling the area. These robots move along the walls of the facility and report suspicious observations to the central security office. The only flaw in the system a competitor抯 agent could find is the fact that the robots radio their movements unencrypted. Not being able to find out more, the agent wants to use that information to calculate the exact size of the area occupied by the new facility. It is public knowledge that all the corners of the building are situated on a rectangular grid and that only straight walls are used. Figure 1 shows the course of a robot around an example area.

 
Figure 1: Example area. 
You are hired to write a program that calculates the area occupied by the new facility from the movements of a robot along its walls. You can assume that this area is a polygon with corners on a rectangular grid. However, your boss insists that you use a formula he is so proud to have found somewhere. The formula relates the number I of grid points inside the polygon, the number E of grid points on the edges, and the total area A of the polygon. Unfortunately, you have lost the sheet on which he had written down that simple formula for you, so your first task is to find the formula yourself. 

Input

The first line contains the number of scenarios. 
For each scenario, you are given the number m, 3 <= m < 100, of movements of the robot in the first line. The following m lines contain pairs 揹x dy�of integers, separated by a single blank, satisfying .-100 <= dx, dy <= 100 and (dx, dy) != (0, 0). Such a pair means that the robot moves on to a grid point dx units to the right and dy units upwards on the grid (with respect to the current position). You can assume that the curve along which the robot moves is closed and that it does not intersect or even touch itself except for the start and end points. The robot moves anti-clockwise around the building, so the area to be calculated lies to the left of the curve. It is known in advance that the whole polygon would fit into a square on the grid with a side length of 100 units. 

Output

The output for every scenario begins with a line containing 揝cenario #i:� where i is the number of the scenario starting at 1. Then print a single line containing I, E, and A, the area A rounded to one digit after the decimal point. Separate the three numbers by two single blanks. Terminate the output for the scenario with a blank line.

Sample Input

2
4
1 0
0 1
-1 0
0 -1
7
5 0
1 3
-2 2
-1 0
0 -3
-3 1
0 -3

Sample Output

Scenario #1:
0 4 1.0 Scenario #2:
12 16 19.0

Source

-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=

Pick定理的证明推荐个网址:episte.math.ntu.edu.tw/articles/sm/sm_25_10_1/page2.html

Area=i + b/2 - 1

i为内点 b为边上点

还有点在多边形边上运用GCD的证明,确实不会,希望大神看到给我解释一下

超时代码:

 #include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm> #define eps 1e-8
#define MAXX 210
using namespace std; typedef struct point
{
double x;
double y;
}point;
typedef struct line
{
point st;
point ed;
}line; bool dy(double x,double y)
{
return x>y+eps;
}
bool xy(double x,double y)
{
return x<y-eps;
}
bool dyd(double x,double y)
{
return x>y-eps;
}
bool xyd(double x,double y)
{
return x<y+eps;
}
bool dd(double x,double y)
{
return fabs(x-y)<eps;
} double crossProduct(point a,point b,point c)//ac -> ab
{
return (c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x);
}
double dist(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} bool onSegment_1(point a,point b,point c)
{
double maxx=max(a.x,b.x);
double minx=min(a.x,b.x);
double maxy=max(a.y,b.y);
double miny=min(a.y,b.y); if(dd(crossProduct(a,b,c),0.0) && xyd(c.x,maxx) && dyd(c.x,minx)
&& xyd(c.y,maxy) && dyd(c.y,miny))
return true;
return false;
} bool segIntersect_1(point p1,point p2,point p3,point p4)
{
double d1=crossProduct(p3,p4,p1);
double d2=crossProduct(p3,p4,p2);
double d3=crossProduct(p1,p2,p3);
double d4=crossProduct(p1,p2,p4); if(xy(d1*d2,0.0) && xy(d3*d4,0.0))
return true;
if(dd(d1,0.0) && onSegment_1(p3,p4,p1))
return true;
if(dd(d2,0.0) && onSegment_1(p3,p4,p2))
return true;
if(dd(d3,0.0) && onSegment_1(p1,p2,p3))
return true;
if(dd(d4,0.0) && onSegment_1(p1,p2,p4))
return true;
return false;
} point p[MAXX];
line li[MAXX];
int n; bool inPolygon_1(point pot)
{
int count=;
line l;
l.st=pot;
l.ed.x=1e10;
l.ed.y=pot.y;
p[n]=p[];
for(int i=; i<n; i++)
{
if( onSegment_1(p[i],p[i+],pot ))
return true;
if(!dd(p[i].y,p[i+].y))
{
int tmp=-;
if(onSegment_1(l.st,l.ed,p[i]))
tmp=i;
else if(onSegment_1(l.st,l.ed,p[i+]))
tmp=i+;
if(tmp != - && dd(p[tmp].y,max(p[i].y,p[i+].y)))
count++;
else if(tmp == - && segIntersect_1(p[i],p[i+],l.st,l.ed))
count++;
}
}
if(count % ==)
return true;
return false;
} bool inPolygon_2(point pot)
{
int count=;
line l;
l.st=pot;
l.ed.x=1e10;
l.ed.y=pot.y;
p[n]=p[];
for(int i=; i<n; i++)
{
if( onSegment_1(p[i],p[i+],pot ))
return false;
if(!dd(p[i].y,p[i+].y))
{
int tmp=-;
if(onSegment_1(l.st,l.ed,p[i]))
tmp=i;
else if(onSegment_1(l.st,l.ed,p[i+]))
tmp=i+;
if(tmp != - && dd(p[tmp].y,max(p[i].y,p[i+].y)))
count++;
else if(tmp == - && segIntersect_1(p[i],p[i+],l.st,l.ed))
count++;
}
}
if(count % ==)
return true;
return false;
} double Area(int n)
{
if(n<)return ;
int i;
double ret=0.0;
for(i=; i<=n; i++)
{
ret+=(crossProduct(p[],p[i-],p[i]));
}
return fabs(ret)/2.0;
} int main()
{
int m,i,j;
int ttmp=;
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
p[].x=;p[].y=;
double x,y;
double maxx=-,maxy=-,minx=,miny=;
for(i=; i<=n; i++)
{
scanf("%lf%lf",&x,&y);
p[i].x=p[i-].x+x;
p[i].y=p[i-].y+y;//printf("%lf %lf^^",p[i].x,p[i].y);
}
for(i=; i<=n; i++)
{
maxx=maxx>p[i].x?maxx:p[i].x;
maxy=maxy>p[i].y?maxy:p[i].y;
minx=minx<p[i].x?minx:p[i].x;
miny=miny<p[i].y?miny:p[i].y;
}//printf("%lf %lf^^%lf %lf**",minx,maxx,miny,maxy);
int in=,edge=,sum=;
point cas;
for(i=minx; i<=maxx; i++)
{
for(j=miny; j<=maxy; j++)
{
cas.x=i;cas.y=j;
if(inPolygon_1(cas))
{
sum++;
}
if(inPolygon_2(cas))
{
in++;
}
}
}
double area=Area(n);
edge=sum-in;
printf("Scenario #%d:\n",ttmp++);
printf("%d %d %.1lf\n",in,edge,area);
}
return ;
}

Pick定理运用

 #include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm> #define eps 1e-8
#define MAXX 210 typedef struct point
{
double x;
double y;
}point; int gcd(int a,int b)
{
return b ? gcd(b,a%b) : a;
} double crossProduct(point a,point b,point c)
{
return (c.x-a.x)*(b.y-a.y)-(c.y-a.y)*(b.x-a.x);
} point p[MAXX];
int onBorder(int n)
{
int sum=;
for(int i=; i<n; i++)
{
sum+=gcd(abs((int)(p[i].x-p[i+].x)),abs((int)(p[i].y-p[i+].y)));
}
return sum;
} double area(int n)
{
double ans=0.0;
for(int i=; i<=n; i++)
{
ans+=crossProduct(p[],p[i-],p[i]);
}
return fabs(ans)/2.0;
} int main()
{
int n,m,i,j;
scanf("%d",&n);
int cas=;
while(n--)
{
scanf("%d",&m);
p[].x=;p[].y=;
double x,y;
for(i=; i<=m; i++)
{
scanf("%lf%lf",&x,&y);
p[i].x=p[i-].x+x;
p[i].y=p[i-].y+y;
}
double are=area(m);
int edge=onBorder(m);
printf("Scenario #%d:\n",cas++);
printf("%d %d %.1lf\n\n",(int)are+-edge/,edge,are);
}
return ;
}

poj 1265 Area (Pick定理+求面积)的更多相关文章

  1. POJ 1265 Area (Pick定理 & 多边形面积)

    题目链接:POJ 1265 Problem Description Being well known for its highly innovative products, Merck would d ...

  2. poj 1265 Area(pick定理)

    Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4373 Accepted: 1983 Description Bein ...

  3. [poj 1265]Area[Pick定理][三角剖分]

    题意: 给出机器人移动的向量, 计算包围区域的内部整点, 边上整点, 面积. 思路: 面积是用三角剖分, 边上整点与GCD有关, 内部整点套用Pick定理. S = I + E / 2 - 1 I 为 ...

  4. Area - POJ 1265(pick定理求格点数+求多边形面积)

    题目大意:以原点为起点然后每次增加一个x,y的值,求出来最后在多边形边上的点有多少个,内部的点有多少个,多边形的面积是多少. 分析: 1.以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其 ...

  5. poj 1265 Area( pick 定理 )

    题目:http://poj.org/problem?id=1265 题意:已知机器人行走步数及每一步的坐标   变化量 ,求机器人所走路径围成的多边形的面积.多边形边上和内部的点的数量. 思路:1.以 ...

  6. POJ1265——Area(Pick定理+多边形面积)

    Area DescriptionBeing well known for its highly innovative products, Merck would definitely be a goo ...

  7. poj 1654 Area (多边形求面积)

    链接:http://poj.org/problem?id=1654 Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions:  ...

  8. POJ 1265 Area (pick定理)

    题目大意:已知机器人行走步数及每一步的坐标变化量,求机器人所走路径围成的多边形的面积.多边形边上和内部的点的数量. 思路:叉积求面积,pick定理求点. pick定理:面积=内部点数+边上点数/2-1 ...

  9. poj 1265 Area 面积+多边形内点数

    Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5861   Accepted: 2612 Description ...

随机推荐

  1. scala伴生对象

    package com.test.scala.test /** * 伴生对象指的是在类中建立一个object */ class AssociatedObject { private var count ...

  2. php版redis插件,SSDB数据库,增强型的Redis管理api实例

    php版redis插件,SSDB数据库,增强型的Redis管理api实例 SSDB是一套基于LevelDB存储引擎的非关系型数据库(NOSQL),可用于取代Redis,更适合海量数据的存储.另外,ro ...

  3. jython学习笔记2

    1.%是求余,//是整除的商,**是乘方 abs(var) Absolute value pow(x, y) Can be used in place of ** operator pow(x,y,m ...

  4. struts2,实现Ajax异步通信

    用例需要依赖的jar: struts2-core.jar struts2-convention-plugin.jar,非必须 org.codehaus.jackson.jar,提供json支持 用例代 ...

  5. ectouch第十一讲 之 ECTouch 菜单里如何添加文章链接

    1.首先在 ectouch 后台添加好文章分类和文章内容(具体添加方法很简单,这里就不再赘述),然后在菜单管理里添加导航如下(链接地址的获取方法参考步骤 2):2.文章分类列表 域名/mobile/i ...

  6. js中字符串转换为数字的方法

    parseInt; parseFload; +; parseInt() 和 parseFloat() 函数会尝试逐个解析字符串中的字符,直到遇上一个无法被解析成数字的字符,然后返回该字符前所有数字字符 ...

  7. android 系统相册调用,各版本的区别总结

    请求系统相册有三个Action: (注意以下  图库(缩略图)   和  图片(原图)  的区别) ACTION_OPEN_DOCUMENT    仅限4.4或以上使用  默认打开原图 ACTION_ ...

  8. html的textarea控制字数小案例

    <h3>设计理念说明(200字以内)</h3> <textarea onkeyup="checkLen(this)"></textarea ...

  9. Expanding Rods(二分POJ1905)

    Expanding Rods Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 13688   Accepted: 3527 D ...

  10. JAVA基础知识之JVM-——类加载器

    类加载器负责将.class文件加载到内存,并为其创建java.lang.Class对象,这个对象就代表这个类. 在Java中,通过包名+类名来唯一标识一个类,而在JVM中,要用 类加载器实例+包名+类 ...