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. 其 ...
随机推荐
- 搭建idea下的vue工程
需要先安装好nodejs和npm 输入下面的命令查看是否成功安装 node -v npm -v 一.开始 工作目录:IdeaProjects使用idea新建Static Web项目:demo 在dem ...
- Python获取下载速度并显示进度条
#!/usr/bin/python3 # -*- coding:utf-8 -*- import sys import time from urllib import request ''' urll ...
- Impala系列:Impala查询优化
==========================理解 mem_limit 参数==========================set mem_limit=-1b #取消内存限制set mem_ ...
- Immunity Debugger学习
1.Immunity Debugger简介 Immunity Debugger软件专门用于加速漏洞利用程序的开发,辅助漏洞挖掘以及恶意软件分析.它具备一个完整的图形用户界面,同时还配备了迄今为止最为强 ...
- SQLMap用户手册【超详细】
http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 当给sqlmap这么一个url的时候,它会: 1.判断可注入的参数 2.判断可以用那种SQL注 ...
- Emmet 记录
Refs 熟悉 css 有优势,emmet 的的缩写语法特别像 css 选择器. =>参考本博笔记 # id > 直接子元素 child . class + Sibling 同级相邻的一个 ...
- c# 线程锁 ,
using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace ...
- PHP文件缓存包含三种格式
http://developer.51cto.com/art/200912/166975.htm PHP文件缓存的速度一直是PHP程序员们关心的问题,他们一直在探讨着如何才能提高PHP文件缓存的效率来 ...
- span i s等行内元素标签之间出现奇怪空格符号
上述展开信息本来是这样写的,但是很奇怪windows下的测试环境支付时间前面莫名其妙多了个小方框 <p> <span><i>收货人:</i>{remar ...
- mui单选和多选框
具体见代码: <!doctype html> <html> <head> <meta charset="UTF-8"> <ti ...