poj 1265 Area【计算几何:叉积计算多边形面积+pick定理计算多边形内点数+计算多边形边上点数】
题目:http://poj.org/problem?id=1265
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 注意:题目给出的成对的数可不是坐标,是在x和y方向走的数量。边界上的格点数:一条左开右闭的线段(x1, x2)->(x2, y2)上的格点数为:gcd( abs(x2-x1), abs(y2-y1) );
Pick公式:对于给定的坐标都是整点的简单多边形,有如下等式:
多边形面积=多边形内部格点数+边上的格点数/2 - 1; 由此可以推出如何计算多边形内部的格点数量!
当然这需要知道多边形的面积,计算多边形的面积:顺时针或逆时针相邻两点分别与原点构成的向量的叉积累加和,再取绝对值,再除2。
(因为顺逆方向的问题,可能会导致叉积累加和为负,又因为叉积计算的是向量围成的四边行的面积所以还要除2) 代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <iostream>
#include <string>
#include <algorithm> using namespace std; struct node
{
int x;
int y;
}q[110]; int cal_area(node a, node b)
{
return a.x*b.y-a.y*b.x;
} //叉积计算两个向量的面积 int gcd(int a, int b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
int tg; scanf("%d", &tg);
int n;
int i, j;
for(int cnt=1; cnt<=tg; cnt++){
scanf("%d", &n);
q[0].x=0; q[0].y=0; //这是坐标原点 int p_on_l=0; //point on line for(i=1; i<=n; i++){
scanf("%d %d", &q[i].x, &q[i].y );
//先计算线段上的点数
int dx=abs(q[i].x);
int dy=abs(q[i].y);
p_on_l+=gcd(dx, dy); q[i].x+=q[i-1].x;
q[i].y+=q[i-1].y; //题目中给出的是前一个点在x y方向上行走的数量
} //只要累加就可以计算出i节点的坐标
//所有点的坐标计算完毕
int area=0;
for(i=2; i<=n; i++){
area+=cal_area(q[i], q[i-1]);
}
area=abs(area); //多边行的面积一定大于等于0 如果求出的结果为负值
//说明叉积计算的方向是和正值计算相比是反的
double ans=area/2.0;//叉积计算的是平行四边行的面积 不是三角形 面积要减半 printf("Scenario #%d:\n", cnt);
printf("%d %d %.1lf\n", (area/2+1-p_on_l/2), p_on_l, ans);
printf("\n");
}
return 0;
}
poj 1265 Area【计算几何:叉积计算多边形面积+pick定理计算多边形内点数+计算多边形边上点数】的更多相关文章
- poj 1265 Area 面积+多边形内点数
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5861 Accepted: 2612 Description ...
- POJ 1265 Area (Pick定理 & 多边形面积)
题目链接:POJ 1265 Problem Description Being well known for its highly innovative products, Merck would d ...
- 2018.07.04 POJ 1265 Area(计算几何)
Area Time Limit: 1000MS Memory Limit: 10000K Description Being well known for its highly innovative ...
- poj 1265 Area (Pick定理+求面积)
链接:http://poj.org/problem?id=1265 Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- poj 1265 Area(pick定理)
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4373 Accepted: 1983 Description Bein ...
- POJ 1265 Area POJ 2954 Triangle Pick定理
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5227 Accepted: 2342 Description ...
- POJ 1265 Area (pick定理)
题目大意:已知机器人行走步数及每一步的坐标变化量,求机器人所走路径围成的多边形的面积.多边形边上和内部的点的数量. 思路:叉积求面积,pick定理求点. pick定理:面积=内部点数+边上点数/2-1 ...
- [poj 1265]Area[Pick定理][三角剖分]
题意: 给出机器人移动的向量, 计算包围区域的内部整点, 边上整点, 面积. 思路: 面积是用三角剖分, 边上整点与GCD有关, 内部整点套用Pick定理. S = I + E / 2 - 1 I 为 ...
- poj 1265 Area(Pick定理)
Area Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5666 Accepted: 2533 Description ...
随机推荐
- Android-ViewPagerIndicator框架使用——LinePageIndicator
前言:LinePageIndicator类似CirclePageIndicator,只是将圆点指示变成了长条指示. 一:使用是定义的布局文件simple_lines : <LinearLayou ...
- 深入PHP内核 SAPI探究
转自 http://www.csdn.net/article/2014-09-26/2821885-exploring-of-the-php-2 SAPI是Server Application Pro ...
- Android无线测试之—UiAutomator UiDevice API介绍八
获取包名.开启通知栏.快速设置.获取布局文件的方法 一.包名.通知栏.快速设置.布局文件等相关知识: 1)包名:标示应用的符号,每个应用的名字 2)通知栏:从主界面的顶端向下拉,就可以打开通知栏 3) ...
- 记录-java执行请求的URL
package wzh.Http; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...
- 【转】hibernate中的映射文件xxx.hbm.xml详解总结
一.Hibernate映射文件的作用: Hibernate映射文件是Hibernate与数据库进行持久化的桥梁 二,Hibernate映射文件主要内容: (1).映射内容的定义: Hibern ...
- dataTables的导出Excel功能
Datatables它是一款基于jQuery表格插件,钟情于它操作dom的灵活.做后台的同学想必使用它能事半功倍,而且交互强.容易扩展. 我也是最近要做公司后台界面,表格涉及的很多,所以考虑使用DT, ...
- Linux CentOS使用yum安装Docker
Docker支持以下的CentOS版本: 目前,CentOS仅发行版本中的内核支持Docker. Docker运行在CentOS7上,要求系统为64位.系统内核版本为3.10以上. Docker运行在 ...
- zhparser是什么
zhparser是什么 zhparser是一个PostgreSQL中文分词的插件,通过它,可以使PostgreSQL支持中文的全文检索(Full Text Search). 为什么需要zhparser ...
- 【C语言】linux C写入本地文件
//定义写入文件 FILE *pFile; //定义文件路径变量 ]; //变量赋值 sprintf(local_file,"/tmp/test.json"); //打开文件 pF ...
- centos中搭建nginx环境
原文地址 安装PCRE 源码:ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ cd /usr/local/src wget ftp://f ...
边界上的格点数:一条左开右闭的线段(x1, x2)->(x2, y2)上的格点数为:gcd( abs(x2-x1), abs(y2-y1) );