The  Boy Next   Doors

题意:给定一个固定大小的房间($x,y$的范围都是$[0,10]$),有$n$个墙壁作为障碍(都与横坐标轴垂直),每个墙壁都有两扇门分别用四个点来描述,起点终点固定在$(0,5)$和$(10,5)$,求起点到终点的最短路长度,$n<=18$


题解:

我们把每堵墙的每一“段”作为一条线段,对任意两点$u,v$,如果两点间的连线不和其他线段相交,那我们从$u$走到$v$的最短距离就是他们的欧几里得距离,对所有点对都这么做一遍,处理出所有能够直接到达的点之间的距离

如果不能直接从$u$到$v$,那么既然是最短路,那走直线一定比走曲线要好,也就是一定是经过他们中间的某些点然后到达的,然后对所有点跑一次最短路就好了

这题范围很小Floyd也能过…

  1 #include<cstdio>
2 #include<cmath>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6
7 const double precision=10e-6;
8
9 const double INF=(~0u>>2);
10
11 const int N=105;
12
13 struct Point
14 {
15 double x,y;
16 }p[N];
17
18 struct Line
19 {
20 Point a,b;
21 }l[N];
22
23 int n,cnt_point,cnt_line;
24
25 double dist[N][N];
26
27 inline int dblcmp(double d)
28 {
29 if(fabs(d)<precision)
30 return 0;
31 return (d>0?1:-1);
32 }
33
34 inline double det(double x1,double y1,double x2,double y2)
35 {
36 return x1*y2-x2*y1;
37 }
38
39 inline double cross(Point a,Point b,Point c)
40 {
41 return det(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
42 }
43
44 inline bool SegCrossSimple(Point a,Point b,Point c,Point d)
45 {
46 return (dblcmp(cross(c,a,b))^dblcmp(cross(d,a,b)))==-2&&(dblcmp(cross(a,c,d))^dblcmp(cross(b,c,d)))==-2;
47 }
48
49 inline double sqr2(double x)
50 {
51 return x*x;
52 }
53
54 inline double dis(int i,int j)
55 {
56 return sqrt(sqr2(p[i].x-p[j].x)+sqr2(p[i].y-p[j].y));
57 }
58
59 inline void addPoint(double x,double y)
60 {
61 p[++cnt_point]=(Point){x,y};
62 }
63
64 inline void addLine(double x1,double y1,double x2,double y2)
65 {
66 l[++cnt_line]=(Line){(Point){x1,y1},(Point){x2,y2}};
67 }
68
69 inline void init()
70 {
71 memset(p,0,sizeof(p));
72 memset(l,0,sizeof(l));
73 cnt_point=cnt_line=0;
74 addPoint(0,5);addPoint(10,5);
75 }
76
77 inline void solve()
78 {
79 init();
80
81 double x,y1,y2,y3,y4;
82 for(register int i=1;i<=n;i++)
83 {
84 scanf("%lf%lf%lf%lf%lf",&x,&y1,&y2,&y3,&y4);
85 addPoint(x,y1);addPoint(x,y2);
86 addPoint(x,y3);addPoint(x,y4);
87 addLine(x,0,x,y1);addLine(x,y2,x,y3);addLine(x,y4,x,10);
88 }
89
90 for(register int i=1;i<=cnt_point;i++)dist[i][i]=0;
91
92 for(register int i=1;i<=cnt_point;i++)
93 {
94 for(register int j=i+1;j<=cnt_point;j++)
95 {
96 bool flag=1;
97 for(register int k=1;k<=cnt_line;k++)
98 {
99 if(SegCrossSimple(p[i],p[j],l[k].a,l[k].b))
100 {
101 flag=0;
102 break;
103 }
104 }
105 if(flag)
106 dist[i][j]=dis(i,j);
107 else
108 dist[i][j]=INF;
109
110 dist[j][i]=dist[i][j];
111 }
112 }
113
114 for(register int k=1;k<=cnt_point;k++)
115 for(register int i=1;i<=cnt_point;i++)
116 for(register int j=1;j<=cnt_point;j++)if(dist[i][k]!=INF&&dist[k][j]!=INF)
117 dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);
118
119 printf("%.2lf\n",dist[1][2]);
120 }
121
122 int main()
123 {
124 while(scanf("%d",&n)==1)
125 {
126 if(n==-1)break;
127 solve();
128 }
129 return 0;
130 }

[日常摸鱼]UVA393 The Doors 简单计算几何+最短路的更多相关文章

  1. ●POJ 1556 The Doors(简单计算几何+最短路)

    ●赘述题目 10*10的房间内,有竖着的一些墙(不超过18个).问从点(0,5)到(10,5)的最短路. 按照输入样例,输入的连续5个数,x,y1,y2,y3,y4,表示(x,0--y1),(x,y2 ...

  2. [日常摸鱼]bzoj1502[NOI2005]月下柠檬树-简单几何+Simpson法

    关于自适应Simpson法的介绍可以去看我的另一篇blog http://www.lydsy.com/JudgeOnline/problem.php?id=1502 题意:空间里圆心在同一直线上且底面 ...

  3. Hash 日常摸鱼笔记

    本篇文章是Hash在信息学竞赛中的应用的学习笔记,分多次更新(已经有很多坑了) 一维递推 首先是Rabin-Karp,对于一个长度为\(m\)的串\(S\) \(f(S)=\sum_{i=1}^{m} ...

  4. [日常摸鱼]HDU1724 Ellipse-自适应Simpson法

    模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被 ...

  5. [日常摸鱼]bzoj3224普通平衡树-Treap、Splay、01Trie、替罪羊树…

    http://www.lydsy.com/JudgeOnline/problem.php?id=3224 经典的平衡树模板题-各种平衡树好像都可以(黄学长之前好像还用vector卡过了这题) 所以这篇 ...

  6. [日常摸鱼]bzoj1257余数之和

    题意:输入$k,n$,求$\sum_{i=1}^n k \mod i$ $k \mod i=k-i*\lfloor \frac{k}{i} \rfloor $,$n$个$k$直接求和,后面那个东西像比 ...

  7. [日常摸鱼]bzoj1001狼抓兔子-最大流最小割

    题意就是求最小割- 然后我们有这么一个定理(最大流-最小割定理 ): 任何一个网络图的最小割中边的容量之和等于图的最大流. (下面直接简称为最大流和最小割) 证明: 如果最大流>最小割,那把这些 ...

  8. [日常摸鱼]pojKaka's Matrix Travels-拆点+最大费最大流

    方格取数的升级版,每个格子最多取一次. $k=1$的话就是个普及组的dp题,$k=2$就是在之前的基础上多加两维. 然而现在$k$太大了当然就不dp啦 对于$k=1$的情况我们还可以把$(i,j)$向 ...

  9. [日常摸鱼]loj6000「网络流 24 题」搭配飞行员

    题面 应该是二分图匹配,不过我写的是网络最大流. dinic求二分图最大匹配:加个源点和汇点,源点连向二分图的一边所有点,二分图的另一边所有点连向汇点,很明显这样得到的最大流就是这个二分图的最大匹配. ...

随机推荐

  1. 详细!Mybatis-plus常用API全套教程,我就不信你看完还不懂!

    前言 官网:Mybatis-plus官方文档 简化 MyBatis ! 创建数据库 数据库名为mybatis_plus 创建表 创建user表 DROP TABLE IF EXISTS user; C ...

  2. 这个厉害了,阿里P7大佬都在看的SpringCloud 总结,帮你梳理全部知识点!

    微服务 微服务架构是一种以一些微服务来替代开发单个大而全应用的方法,每一个小服务运行在自己的进程里,并以轻量级的机制来通信, 通常是 HTTP RESTful API.微服务强调小快灵, 任何一个相对 ...

  3. D - Number of Multisets 题解(思维dp)

    题目链接 题目大意 给你一个数k和n,表示用n个\(1/2^i(i=0,1,2.....)\)组成k有多少种方案数 题目思路 这个dp实属巧妙 设\(dp[i][j]表示i个数构成j\) 这i个数可以 ...

  4. Java基础教程——接口

    接口 接口只是一种约定.--Anders 接口定义了一种规范--多个类共同的公共行为规范. 对于接口的实现者--规定了必须向外提供哪些服务 对于接口的调用者--规定了可以调用哪些服务,如何调用这些服务 ...

  5. python删除list中的空list

    list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText'] 如何删除空列表,以便我得到: list2 = ['text', 'text2 ...

  6. 关于esp8266的SDK开发串口打印mismatch map 3,spi_size_map 6 system_partition_table_regist fail解决办法

    最近在学习esp8266 用的sdk开发,烧录碰到个问题,本人使用的esp8266模块是esp8266-12f,模块是4M的也就是32Mbit 参考了网上的很多办法,大部分写的不清楚也没解决,摸索了几 ...

  7. maven私服拉取jar失败(内网)

    解决方案: 1.私服没jar,找私服负责人添加 2.私服有拉不下来,重启nexus服务端(负责人做) 3.本地有jar但是idea中没找到,先执行一下reimport,不行的话,随意修改下pom文件, ...

  8. 老猿Python博文汇总目录--按标题排序

    ☞ ░ 前往老猿Python博文目录 ░ 本部分为老猿CSDN全部博文的汇总(含转载部分),所有文章在此未进行归类,仅按文章标题排序,方便关键字查找.本部分内容将至少以周为单位定期更新,可能不包含发布 ...

  9. moviepy音视频剪辑VideoClip类to_mask方法、to_RGB、afx方法

    ☞ ░ 前往老猿Python博文目录 ░ moviepy音视频剪辑VideoClip类to_mask方法和to_RGB方法用于进行剪辑内容变换. 1.to_mask方法 to_mask方法返回一个由调 ...

  10. sqlite 数据库与mysql 数据库使用区别记录

    遇到了就记点儿. 1.sqlite 中,设置外键关联,没啥用.只有mysql 中可用.