LA 3263 (欧拉定理)
欧拉定理题意: 给你N 个点,按顺序一笔画完连成一个多边形
求这个平面被分为多少个区间
欧拉定理 : 平面上边为 n ,点为 c 则 区间为 n + 2 - c;
思路: 先扫,两两线段的交点,存下来,有可能会有重复点, 用STL unique 去重
在把每个点判断是否在线段上,有,则会多出一条线段(不包括端点的点)
这样就得出结果了 O(n * n ) /// 这题还有点卡精度, 1e-11 WA, 1e-9 A了…….
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
const int maxn = 300 +31;
const double eps = 1e-9;
struct Point {
double x, y;
Point(double x = 0,double y = 0) : x(x), y(y) {}
}; int dcmp(double x) { if(fabs(x) < eps) return 0 ; else return x < 0 ? -1 : 1; } typedef Point Vector;
Vector operator + (Vector A, Vector B) { return Vector(A.x+B.x, A.y+B.y); }
Vector operator - (Point A, Point B) { return Vector(A.x-B.x, A.y-B.y); }
Vector operator * (Vector A, double p) { return Vector(A.x*p, A.y*p ); }
Vector operator / (Vector A, double p) { return Vector(A.x/p, A.y/p ); }
bool operator < (const Point &a, const Point &b) { return a.x < b.x || (a.x==b.x && a.y < b.y); }
bool operator == (const Point &a, const Point &b) {
return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;
} double Dot (Vector A, Vector B) { return A.x*B.x + A.y*B.y; }
double Length (Vector A) { return sqrt(Dot(A,A)); }
double Angle (Vector A, Vector B) { return acos(Dot(A,B) / Length(A) / Length(B)) ;}
double Cross (Vector A, Vector B) { return A.x*B.y - A.y*B.x; } Point GetLineIntersection (Point P, Vector v, Point Q, Vector w) { ///求直线焦点
Vector u = P - Q;
double t = Cross(w, u) / Cross(v, w);
return P + v*t;
}
bool SegmentProperIntersection (Point a1, Point a2, Point b1, Point b2) { /// 判断两线段是否相交 (不包括端点)
double c1 = Cross(a2-a1,b1-a1), c2 = Cross(a2-a1,b2-a1),
c3 = Cross(b2-b1,a1-b1), c4 = Cross(b2-b1,a2-b1);
return dcmp(c1)*dcmp(c2) < 0 && dcmp(c3)*dcmp(c4) < 0;
}
bool OnSegment (Point p, Point a1, Point a2) { /// 判断点是否在线段上(不包括端点)
return dcmp(Cross(a1-p,a2-p)) == 0 && dcmp(Dot(a1-p, a2-p)) < 0;
} Point P[maxn], V[maxn*maxn]; int main()
{
int n,kase = 1;
while( cin >> n && n )
{
for(int i = 0; i < n; ++i)
{
cin >> P[i].x >> P[i].y;
V[i] = P[i];
}
n--;
int c = n;
for(int i = 0; i < n; ++i)
{
for(int j = i+1; j < n; ++j)
if(SegmentProperIntersection(P[i],P[i+1],P[j],P[j+1]))
V[c++] = GetLineIntersection(P[i],P[i+1]-P[i],P[j],P[j+1]-P[j]);
}
sort(V,V+c);
c = unique(V,V+c) - V;///顶点个数
int e = n;///边
for(int i = 0; i < c; ++i)
{
for(int j = 0; j < n; ++j)
if(OnSegment(V[i],P[j],P[j+1])) e++;
}
int sum = e+2-c;
//if(sum == 1) printf("Case %d: There are %d piece.\n",kase++,sum);
printf("Case %d: There are %d pieces.\n",kase++,sum);
}
return 0;
}
LA 3263 (欧拉定理)的更多相关文章
- LA 3263 /// 欧拉定理 oj21860
题目大意: n个端点的一笔画 第n个和第1个重合 即一笔画必定是闭合曲线 输出平面被分成的区域数 欧拉定理 V+F-E=2 即 点数+面数-边数=2 (这里的面数包括了外部) #include < ...
- LA 3263 欧拉定理
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...
- LA 3263 (平面图的欧拉定理) That Nice Euler Circuit
题意: 平面上有n个端点的一笔画,最后一个端点与第一个端点重合,即所给图案是闭合曲线.求这些线段将平面分成多少部分. 分析: 平面图中欧拉定理:设平面的顶点数.边数和面数分别为V.E和F.则 V+F- ...
- LA 3263 That Nice Euler Circuit(欧拉定理)
That Nice Euler Circuit Little Joey invented a scrabble machine that he called Euler, after the grea ...
- 简单几何(求划分区域) LA 3263 That Nice Euler Circuit
题目传送门 题意:一笔画,问该图形将平面分成多少个区域 分析:训练指南P260,欧拉定理:平面图定点数V,边数E,面数F,则V + F - E = 2.那么找出新增的点和边就可以了.用到了判断线段相 ...
- LA 3263 平面划分
Little Joey invented a scrabble machine that he called Euler, after the great mathematician. In his ...
- POJ 2284 That Nice Euler Circuit (LA 3263 HDU 1665)
http://poj.org/problem?id=2284 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&a ...
- LA 3263 好看的一笔画 欧拉几何+计算几何模板
题意:训练指南260 #include <cstdio> #include <cstring> #include <algorithm> #include < ...
- UVAlive 3263 That Nice Euler Circuit(欧拉定理)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=21363 [思路] 欧拉定理:V+F-E=2.则F=E-V+2. 其 ...
随机推荐
- openstack ovs实现vlan组网
本文是配置文档,非说明文档,只讲配置,不讲原理. controller节点: 网卡信息:ens160 外网网卡 : ens192 数据网卡 /etc/neutron/plugins/ml2/ml2_c ...
- SQL结构化查询语句
SQL结构化查询语句 SQL定义了查询所有关系型数据库的规则. 1.通用语法 SQL语句可以单行或者多行书写,以分号结尾 可以使用空格和缩进增强可读性 不区分大小写,但是关键字建议大写 3种注释 注释 ...
- SQL Server进阶(十一)临时表、表变量
临时表 本地临时表 适合开销昂贵 结果集是个非常小的集合 -- Local Temporary Tables IF OBJECT_ID('tempdb.dbo.#MyOrderTotalsByYe ...
- exec存储过程示例
假如存储过程为test,两个参数为aa,bb那么有以下两种写法,不要带括号EXEC [dbo].[test] @aa = 111, @bb = 222 exec test 111,222
- springboot10-springcloud-eureka 服务注册与发现,负载均衡客户端(ribbon,feign)调用
创建5个项目: 1.服务注册中心 2.服务提供者1 3.服务提供者2(与服务提供者1的代码实现一样,这是是为了模拟负载均衡) 4.ribbon客户端项目 5.feign客户端项目 如图: 一.注册中心 ...
- JavaScript面试技巧(一):基础知识
1.变量类型和计算 变量类型:值类型.引用类型.typeof运算符. 变量计算:字符串拼接.==运算符.if语句.逻辑运算符 2.原型和原型链 构造函数 5个原型规则 3.作用域和闭包-执行上下文 4 ...
- java伪代码 大道至简第一章
import.java.大道至简.*; //一·编程的精义 import.java.编程的精义.*; public class BIANCHENGDEJINGYI { if(愚公死了) 愚公的儿子,孙 ...
- 【css】正确的让文本换行
通常文本换行我们会使用word-break属性,有两个值供我们选择 word-break: break-all; word-break: break-world; 那么如何区分这两个值呢,我们看图说话 ...
- 【tmos】shell工具推荐
xshell(推荐) putty
- 关于tcp queue
半连接队列:服务端维护的与客户端保持SYN_RECV状态的连接队列,等待客户端回复,当收到客户端ack后,如果条件允许(全连接队列未达到最大值),服务端进入ESTAB状态,从半连接队列移到全连接队列的 ...