欧拉定理题意: 给你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 (欧拉定理)的更多相关文章

  1. LA 3263 /// 欧拉定理 oj21860

    题目大意: n个端点的一笔画 第n个和第1个重合 即一笔画必定是闭合曲线 输出平面被分成的区域数 欧拉定理 V+F-E=2 即 点数+面数-边数=2 (这里的面数包括了外部) #include < ...

  2. LA 3263 欧拉定理

    题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_ ...

  3. LA 3263 (平面图的欧拉定理) That Nice Euler Circuit

    题意: 平面上有n个端点的一笔画,最后一个端点与第一个端点重合,即所给图案是闭合曲线.求这些线段将平面分成多少部分. 分析: 平面图中欧拉定理:设平面的顶点数.边数和面数分别为V.E和F.则 V+F- ...

  4. LA 3263 That Nice Euler Circuit(欧拉定理)

    That Nice Euler Circuit Little Joey invented a scrabble machine that he called Euler, after the grea ...

  5. 简单几何(求划分区域) LA 3263 That Nice Euler Circuit

    题目传送门 题意:一笔画,问该图形将平面分成多少个区域 分析:训练指南P260,欧拉定理:平面图定点数V,边数E,面数F,则V + F - E =  2.那么找出新增的点和边就可以了.用到了判断线段相 ...

  6. LA 3263 平面划分

    Little Joey invented a scrabble machine that he called Euler, after the great mathematician. In his ...

  7. 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 ...

  8. LA 3263 好看的一笔画 欧拉几何+计算几何模板

    题意:训练指南260 #include <cstdio> #include <cstring> #include <algorithm> #include < ...

  9. 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. 其 ...

随机推荐

  1. Coding语言强弱类型且动静态类型简单解析。附图解

    话不多说,上图: (以下均以Java来说明) 对于语言的强弱类型: 1.强类型语言:通俗的点来讲,就是对于数据类型,如果开发者定义了一个int数据类型的变量,那么虚拟机就会特别坚定该变量为int,坚决 ...

  2. 解决yum安装mysql时Requires: libc.so.6(GLIBC_2.17)(64bit)

    1.yum install mysql-community-server 1 2 3 4 5 6 7 Error: Package: mysql-community-libs-5.7.17-1.el7 ...

  3. List、Map、set的加载因子,默认初始容量和扩容增量

    首先,这三个概念说下.初始大小,就是创建时可容纳的默认元素个数:加载因子,表示某个阀值,用0~1之间的小数来表示,当已有元素占比达到这个阀值后,底层将进行扩容操作:扩容方式,即指定每次扩容后的大小的规 ...

  4. 二十一、Linux 进程与信号---进程查看和进程状态、进程调度和进程状态变化、进程标识

    21.1 进程查看和进程状态 21.1.1 ps 指令 ps 指令通常可以查看到进程的 ID.进程的用户 ID.进程状态和进程的 Command ps:查看当前用户启动的进程 ps -ef:详细查看后 ...

  5. C#基础_MD5

    MD5加密 1创建Md5 2.开始加密,需要将字符转换为字节数组 3.返回一个加密好的字节数组 4.将字节数组中每个元素按照指定的编码格式解析成字符串 1 static void Main(strin ...

  6. 【bzoj 1901】Zju2112 Dynamic Rankings

    Description 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是 ...

  7. matplotlib-2D绘图库-面向对象

    个人理解:plt--画本    figure--产生画纸 子图 import numpy as np import matplotlib.pyplot as plt #解决能显示中文 plt.rcPa ...

  8. python中读取mongodb数据并保存为csv格式的文件

    import pandas as pd import matplotlib.pyplot as plt import pymongo %matplotlib inline # 连接mongodb数据库 ...

  9. python网络编程初识

    一,什么是计算机网络: 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和 [1]  信 ...

  10. HDFS笔记(二)

    fsimage : NameNode启动时,对文件系统的快照 eidt logs : NameNode启动后,对文件系统的改动序列 namenode在全局里就一个进程,所以存在单点问题 DataNod ...