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. 其 ...
随机推荐
- python 有趣的库练习
这里会将看到别人玩过有趣的实践并记录下来,会是一个长期更新的过程... 以下大部分均非原创变化自网络,只是觉得有趣便记录下来了,如有侵权,请告知删除... 自动化脚本... 20个必不可少的Pytho ...
- 前端常用UI框架
移动端UI框架 Mint UI(饿了么团队) 中文官网:http://mint-ui.github.io/#!/en 饿了么前端团队推出的基于Vue.js的移动端组件库 GitHub地址:https: ...
- 028、限制容器对CPU的使用(2019-01-23 周三)
参考https://www.cnblogs.com/CloudMan6/p/7003199.html 默认情况下,所有容器都可以平等的使用host cpu资源,没有限制 docker 可以通过 ...
- PCA(主成分分析)的简单理解
PCA(Principal Components Analysis),它是一种“投影(projection)技巧”,就是把高维空间上的数据映射到低维空间.比如三维空间的一个球,往坐标轴方向投影,变成了 ...
- SQL Server进阶(十二)常用函数
在SQL 2012基础教程中列出子句是按照以下顺序进行逻辑处理. FROM WHERE GROUP BY HAVING SELECT ORDER BY FROM TableName WHERE Use ...
- MVC |分部视图 PartialView()
介绍如何定义 其实它和普通视图没有多大区别,只是创建分部视图的时候视图里没有任何内容,你需要什么标签你自己加.第二就是分部视图不会执行_ViewStart.cshtml中的内容) 控制器 Partia ...
- PhpStorm+xdebug+postman调试
PhpStorm+xdebug+postman调试 写PHP时,一直用postman做测试,最近发现在测试过程中可以用xdebug来断点调试,比原来手动打exit或者die来断点效率高多了. 下面记录 ...
- 贝叶斯网络与LDA
一.一些概念 互信息: 两个随机变量x和Y的互信息,定义X, Y的联合分布和独立分布乘积的相对熵. 贝叶斯公式: 贝叶斯带来的思考: 给定某些样本D,在这些样本中计算某结论出现的概率,即 给定样本D ...
- Git命令用于检查特定提交的差异
假设你的提交日志如下(可以通过 git log 命名查看) commit 14af3315a2b1234daac74ece61ef913007043e06 Author: wuxianqiang &l ...
- AngularJS--及其他js框架对比
----和 **类似?? Angular 2.谷歌的 React Facebook的 Vue.js. Ember.js. https://github.com/angular/angular.js ...