That Nice Euler Circuit

【题目链接】That Nice Euler Circuit

【题目类型】几何

&题解:

蓝书P260 要用欧拉定理:V+F=E+2 V是顶点数;F是分成了多少区域,也就是本题的答案;E是有多少条边,比如2条线段相交,就有4条边,而不是2条.

还有几点注意:

1.dcmp()没有返回0 调了半天(模板照着敲都能错 0.0!)

2.V[]点没有去重 wa了1次(这个去重还是很难想的,去重之后还要证出原来的方法是正确的)

还有他这种算E(边数)的想法很好:就是枚举最开始给的那n条边,在每条边上找有几个点,假设有1个点在这条边上,这1条边就变成了2条边,以此类推.所以前面就要把已知的点和产生的交点找到,最后别忘了去重.

&代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; //蓝书P255
//1.点的定义
struct Point {
double x,y;
Point (double x=0,double y=0):x(x),y(y) {}
};
//点和向量是一样的内容 所以会出来2个名字
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);} const double eps=1e-10;
//doublue的三态函数
int dcmp(double x) {
if(fabs(x)<eps) return 0;
else return x<0?-1:1;
}
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;}
//有向面积,数值是三角形面积的2倍
double Area2(Point A,Point B,Point C) {return Cross(B-A,C-A);} //向量旋转,doublue的都是弧度
Vector Rotate(Vector A,double rad) {
return Vector(A.x*cos(rad)-A.y*sin(rad),A.x*sin(rad)+A.y*cos(rad));
} //求单位法向量
Vector Normal(Vector A) {
double L=Length(A);
return Vector(-A.y/L,A.x/L);
} //2.点和直线
//调用前请确保两条直线P+tv和Q+tw有唯一交点.当且仅当Cross(v,w)非0
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;
} //点P到直线(过点A,B)的距离
double DistanceToLine(Point P,Point A,Point B) {
Vector v1=B-A,v2=P-A;
return fabs(Cross(v1,v2))/Length(v1);//不加fabs,得到的是有向距离
} //点P到线段AB的距离
double DistanceToSegment(Point P,Point A,Point B) {
if(A==B) return Length(P-A);
Vector v1=B-A,v2=P-A,v3=P-B;
if(dcmp(Dot(v1,v2))>0) return Length(v2);
else if(dcmp(Dot(v1,v3))>0) return Length(v3);
else return fabs(Cross(v1,v2))/Length(v1);
} //求点P在直线AB的投影点Q
Point GetLineProjection(Point P,Point A,Point B) {
Vector v=B-A;
return A+v*(Dot(v,P-A)/Dot(v,v));
} //线段相交判定,两线段恰好有一个公共点,且不在任何一条线段的端点
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;
} //判断点p是否在线段a1a2上(不包含线段的端点)
bool OnSegment(Point p,Point a1,Point a2) {
return dcmp(Cross(a1-p,a2-p))==0&&dcmp(Dot(a1-p,a2-p))<0;
// return dcmp(Dot(a1-p,a2-p))<0;
} //多边形的有向面积
double PolygonArea(Point* p,int n) {
double area=0;
for(int i=1; i<n-1; i++) {
area+=Cross(p[i]-p[0],p[i+1]-p[0]);
}
return area/2;
} //解题代码
const int maxn= 300 +7;
Point P[maxn],V[maxn*maxn]; //dcmp()没有返回0 调了半天
//V[]点没有去重 wa了1次
int main() {
freopen("E:1.in","r",stdin);
int n,kase=0;
while(scanf("%d",&n)==1&&n) {
for(int i=0; i<n; i++) {
scanf("%lf%lf",&P[i].x,&P[i].y);
V[i]=P[i];
}
n--;
int c=n,e=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;
for(int i=0; i<c; i++) {
for(int j=0; j<n; j++) {
if(OnSegment(V[i],P[j],P[j+1])) {
e++;
}
}
}
printf("Case %d: There are %d pieces.\n",++kase,e+2-c);
}
return 0;
}

UVALi 3263 That Nice Euler Circuit(几何)的更多相关文章

  1. UVALive - 3263 That Nice Euler Circuit (几何)

    UVALive - 3263 That Nice Euler Circuit (几何) ACM 题目地址:  UVALive - 3263 That Nice Euler Circuit 题意:  给 ...

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

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

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

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

  4. uvalive 3263 That Nice Euler Circuit

    题意:平面上有一个包含n个端点的一笔画,第n个端点总是和第一个端点重合,因此团史一条闭合曲线.组成一笔画的线段可以相交,但是不会部分重叠.求这些线段将平面分成多少部分(包括封闭区域和无限大区域). 分 ...

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

  6. UVALive 3263: That Nice Euler Circuit (计算几何)

    题目链接 lrj训练指南 P260 //==================================================================== // 此题只需要考虑线 ...

  7. That Nice Euler Circuit(LA3263+几何)

    That Nice Euler Circuit Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu D ...

  8. poj2284 That Nice Euler Circuit(欧拉公式)

    题目链接:poj2284 That Nice Euler Circuit 欧拉公式:如果G是一个阶为n,边数为m且含有r个区域的连通平面图,则有恒等式:n-m+r=2. 欧拉公式的推广: 对于具有k( ...

  9. POJ2284 That Nice Euler Circuit (欧拉公式)(计算几何 线段相交问题)

                                                          That Nice Euler Circuit Time Limit: 3000MS   M ...

随机推荐

  1. zookeeper的Java客户端API

    zookeeper作为一个分布式服务框架,主要用来解决分布式数据一致性问题,对多种语言提供了API.这里主要记录下JAVA客户端API的使用. 1.创建会话 客户端可以通过创建一个ZooKeeper实 ...

  2. Drying POJ - 3104 二分 最优

    题意:有N件湿的衣服,一台烘干机.每件衣服有一个湿度值.每秒会减一,如果用烘干机,每秒会减k.问最少多久可以晒完. 题解:二分.首先时间越长越容易晒完. 其次判定函数可以这样给出:对于答案 X,每一个 ...

  3. background属性解释

    如background: url(images/img1.jpg) no-repeat 0 0; 其中的 0 0,前一个是横坐标上的数,后一个表示纵坐标上的数,而很神奇的是,作为参考的坐标原点不是永远 ...

  4. [skill] ctags支持函数声明

    一般情况下,使用ctags的时候,默认使用如下命令: ctags -R ./ 但是这种情况下,如果运行在include文件夹下的时候,好多函数是跳转不过去的,因为这种默认情况下,函数声明并不会被索引. ...

  5. LeetCode 104 Maximum Depth of Binary Tree 解题报告

    题目要求 Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the ...

  6. python摸爬滚打之day07----基本数据类型补充, 集合, 深浅拷贝

    1.补充 1.1  join()字符串拼接. strs = "阿妹哦你是我的丫个哩个啷" nw_strs = "_".join(strs) print(nw_s ...

  7. 防止atoi函数内存越界

    函数形式为: int atoi(const char *nptr);    函数说明: 参数nptr字符串,如果第一个非空格字符不存在或者不是数字也不是正负号则返回零,否则开始做类型转换,之后检测到非 ...

  8. kali蓝牙连接

    http://blog.csdn.net/hailangnet/article/details/47723181 http://www.aiuxian.com/article/p-3012084.ht ...

  9. BTM学习小记

    BTM的原理跟LDA很像,下面是该模型的概率图: 由该图可以看出来,与LDA的区别在于确定主题分布和词分布后相应地取两个词(而LDA只取一个,即类比常见的骰子说法:先投掷K面的骰子得到主题z,再根据相 ...

  10. 27-4-DMA2D图形加速器

    在实际使用 LTDC 控制器控制液晶屏时,使 LTDC 正常工作后,往配置好的显存地址写入要显示的像素数据, LTDC 就会把这些数据从显存搬运到液晶面板进行显示,而显示数据的容量非常大,所以我们希望 ...