poj1265--Area(求多边形面积+匹克定理)

Area

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 5150   Accepted: 2308

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

Northwestern Europe 2001

首先知识储备:1、匹克定理,在一个点阵中的多边形的面积s,和多边形内部的点的个数a,在多边形边上的点数b,存在关系s = a + b / 2 - 1 ;

2、向量的叉积a = (x1,y1) , b = (x2,y2).a×b = x1*y2 - y1*x2 ; 由矩阵得到。

3、求多边形面积,也就是求有向面积,使用叉积,求出有向的四边形的面积,除2得到三角形的面积,方法:找一个任意定点,开始遍历多边形,每过一条边,就计算叉积,得到对应三角形的面积,面积有正有负,也就对应着多边形的有向面积。即初始向量<a,b>存在一条边<b,c>求出<a,b>和<b,c>的叉积累加,然后更新初始向量为<a,c>。

有了这几个知识,这个题就好解决了,题目给了m个运动方向,即给出x,y代表从当前点运动(x,y)的距离。所以可以假设从(0,0)开始运动的。

在每一次运动中,得到的边上有多少个节点,可以通过gcd(x,y)得到,因为节点都是整数,所以x,y的最大公约数,也就是经过的节点数。然后求出总的多边形面积,最后得到多边形内部点数。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std ;
//匹克定理,s = a + b/2 - 1 ;
struct node{
    int x , y ;
};
int gcd(int a,int b)
{
    return b == 0 ? a : gcd(b,a%b) ;
}
node add(node p,node q)
{
    p.x += q.x ;
    p.y += q.y ;
    return p;
}
double f(node p,node q)
{
    double s = 0 ;
    s = (p.x*q.y - p.y*q.x) / 2.0 ;
    return s ;
}
int main()
{
    int t , tt , m , a , b ;
    double s ;
    node p , q ;
    scanf("%d", &t) ;
    for(tt = 1 ; tt <= t ; tt++)
    {
        b = p.x = p.y = 0 ;
        s = 0.0 ;
        scanf("%d", &m) ;
        scanf("%d %d", &q.x, &q.y) ;
        b += gcd(abs(q.x),abs(q.y)) ;
        p = add(p,q) ;
        m-- ;
        while( m-- )
        {
            scanf("%d %d", &q.x, &q.y) ;
            b += gcd(abs(q.x),abs(q.y)) ;
            s += f(p,q) ;
            p = add(p,q) ;
        }
        printf("Scenario #%d:\n", tt) ;
        printf("%d %d %.1lf\n",   int(s+1-b/2.0) , b, s);
        if( tt != t )
        printf("\n") ;
    }
    return 0;
}
时间: 2024-11-09 04:40:50

poj1265--Area(求多边形面积+匹克定理)的相关文章

poj 1654 Area(求多边形面积 &amp;&amp; 处理误差)

Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16894   Accepted: 4698 Description You are going to compute the area of a special kind of polygon. One vertex of the polygon is the origin of the orthogonal coordinate system. From thi

poj1408——叉积求多边形面积

poj1408——叉积求多边形面积 Fishnet Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 1853   Accepted: 1185 Description A fisherman named Etadokah awoke in a very small island. He could see calm, beautiful and blue sea around the island. The previou

hdu 2036 求多边形面积 (凸、凹多边形)

<题目链接> Problem Description " 改革春风吹满地,不会AC没关系;实在不行回老家,还有一亩三分地.谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而且,还竟然来这么几句打油诗.好呀,老师的责任就是帮你解决问题,既然想种田,那就分你一块.这块田位于浙江省温州市苍南县灵溪镇林家铺子村,多边形形状的一块地,原本是linle 的,现在就准备送给你了.不过,任何事情都没有那么简单,你必须首先告诉我这块地到底有多

三角剖分求多边形面积的交 HDU3060

1 //三角剖分求多边形面积的交 HDU3060 2 3 #include <iostream> 4 #include <cstdio> 5 #include <cstring> 6 #include <stack> 7 #include <queue> 8 #include <cmath> 9 #include <algorithm> 10 using namespace std; 11 12 const int max

poj 1654 Area(求多边形面积)

题意:从原点出发向八个方向走,所给数字串每个数字代表一个方向,终点与原点连线,求所得多边形面积: 思路:(性质)共起点的两向量叉积的一半为两向量围成三角形的面积.以此计算每条边首尾两个向量的叉积,求和,除二: #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const dou

Area - POJ 1654(求多边形面积)

题目大意:从原点开始,1-4分别代表,向右下走,向右走,向右上走,向下走,5代表回到原点,6-9代表,向上走,向左下走,向左走,向左上走.求出最后的多边形面积. 分析:这个多边形面积很明显是不规则的,可以使用向量积直接求出来面积即可. 代码如下: ------------------------------------------------------------------------------------------------------------------------------

HDOJ-2036-改革春风吹满地 叉积求多边形面积

改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 22754 Accepted Submission(s): 11772 Problem Description " 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目

HDU 2036 改革春风吹满地 (求多边形面积)

传送门: 改革春风吹满地 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 42663    Accepted Submission(s): 21856 Problem Description " 改革春风吹满地,不会AC没关系;实在不行回老家,还有一亩三分地.谢谢!(乐队奏乐)" 话说部分学生心态极好,每天就知道游戏,这次考试如

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

题目大意:以原点为起点然后每次增加一个x,y的值,求出来最后在多边形边上的点有多少个,内部的点有多少个,多边形的面积是多少. 分析: 1.以格子点为顶点的线段,覆盖的点的个数为GCD(dx,dy),其中,dxdy分别为线段横向占的点数和纵向占的点数.如果dx或dy为0,则覆盖的点数为dy或dx.2.Pick公式:平面上以格子点为顶点的简单多边形的面积=边上的点数/2+内部的点数+1.3.任意一个多边形的面积等于按顺序求相邻两个点与原点组成的向量的叉积之和. 代码如下: -------------