poj 1265 Area (Pick公式)

原创 2017年01月02日 21:02:31

Area
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 6406   Accepted: 2810

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

[Submit]   [Go Back]   [Status]   [Discuss]


题目大意:求多边形内部的点数,边上的点数和面积。

题解:Pick公式

area = I + E/2 - 1.(I为多边形内的格点数,E为边上的格点数,area为多边形面积)

边上的格点数可以用gcd来求解,一条边上的格点数(不算端点)为gcd(abs(x),abs(y))-1,其中x,y为两个端点横纵坐标的相对移动距离。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define N 1003
using namespace std;
struct point{
	int x,y;
	point (int X=0,int Y=0) {
		x=X,y=Y;
	}
}a[N];
int n;
typedef point vector;
vector operator -(vector a,vector b)
{
	return vector (a.x-b.x,a.y-b.y);
}
int cross(vector a,vector b)
{
	return a.x*b.y-a.y*b.x;
}
int gcd(int x,int y)
{
    int r;
    while(y){
    	r=x%y;
    	x=y;
    	y=r; 
	}
	return x;
}
int main()
{
	freopen("a.in","r",stdin);
	int T; scanf("%d",&T);
	int t=0;
	while (T--){
		t++;
		scanf("%d",&n);
		a[0].x=0; a[0].y=0;
		int count=0;
		for (int i=1;i<=n;i++) {
			int x,y; scanf("%d%d",&x,&y);
			count+=gcd(abs(x),abs(y));
			a[i].x=a[i-1].x+x; a[i].y=a[i-1].y+y;
		}
		a[n+1]=a[1];
		int area=0;
		for (int i=2;i<=n;i++)
		 area+=cross(a[i]-a[1],a[i+1]-a[1]);
		area=abs(area);
		int size=(area+2-count)/2;
		printf("Scenario #%d:\n",t);
		if (area%2)  printf("%d %d %d.5\n",size,count,area/2);
		else printf("%d %d %d.0\n",size,count,area/2);
		printf("\n");
	}
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ 1265 Area pick公式

题目描述:http://poj.org/problem?id=1265 解题思路: 求一个顶点都在整数点上的多边形的面积。 题目中已经提示了多边形的面积A、多边形内的格点I与多边形边上的整点数E存在特...
  • f_cpp
  • f_cpp
  • 2014-11-28 17:10
  • 124

Area poj1265 (pick公式+网格)

Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6457   Accepted: 2823 D...

POJ 1265 Area Pick公式

题目大意:给出一个多边形的轮廓(以边的向量形式给出),求:1.有多少个整点在这个图形里面,2.有多少个点在图形内部,3.图形的面积是多少。 思路:首先明确Pick公式: 公式意义并不是让我...

POJ 1265 Area(面积,pick公式)

转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove 题目:给出一些移动向量,最...

POJ1265Area【pick公式+多边形求面积+点在线段上判断】

Language: Default Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5445   Ac...

poj 1265 Area(Pick公式+Gcd关系+面积公式)

Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3645   Accepted:...

POJ Area 1265(pick定理)

大意:给定从原点出发到一些点,注意所给定的点并不是坐标而是结合上一步的位置应该移动到的位置。求出多边形上的点,内部的点,以及多边形的面积。思路:多边形上的点的个数,可以用GCD(x,y)求出(x,y指...

poj 1265 Area(pick 定理)

链接:poj 1265 题意:从原点出发,给出一些dx,dy移动增量,最终形成一个多边形, 求多边形内部的格点数目,边上的格点数目 ,以及面积。 补充知识: 1、以格子点为顶点的线段,覆盖...

【POJ 1265】 Area (Pick定理+叉积求多边形面积)

【POJ 1265】 Area 从原点开始走 输入的是每次行走x y移动的长度 可正可负 最终会走会起点 问围成的多边形内部点数 边上点数 和面积 用到三个定理: 1.网格中两格点间经...

POJ 1265-Area(多边形面积、边点、内点-pick定理、叉积)

Area Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6452   Accepted:...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)