第一次写计算几何,还是很开心的吧(虽然题目好水qaq)

暴力枚举端点,暴力连边即可

用线段交判一下是否可行.

Code:

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cmath>
  4. #include <cstring>
  5. #define setIO(s) freopen(s".in","r",stdin)
  6. #define maxn 100008
  7. const double eps = 0.00000001;
  8. const double inf = 10000000000.0;
  9. using namespace std;
  10. int n,idx,ls,st,ed;
  11. double map[200][200];
  12. struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y){} }point[maxn];
  13. struct Line{ Point a,b; }line[maxn];
  14. int exis(double t){ return (fabs(t)<=eps) ? 0 : (t < 0 ? -1 : 1 ) ; }
  15. double det(double x1,double y1,double x2,double y2) { return x1*y2-x2*y1; }
  16. double cross(Point a,Point b,Point c) { return det(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y); }
  17. bool check(Point a,Point b,Point c,Point d) {
  18. if((exis(cross(a,c,b)) ^ exis(cross(a,d,b)))==-2 && (exis(cross(d,a,c)) ^ exis(cross(d,b,c))) == -2)
  19. return true;
  20. return false;
  21. }
  22. double dis(Point a,Point b) {
  23. double xx = b.x - a.x;
  24. double yy = b.y - a.y;
  25. return (double)sqrt(xx*xx+yy*yy) ;
  26. }
  27. bool is_ok(int a,int b) {
  28. for(int i=1;i<=ls;++i)
  29. {
  30. if(check(line[i].a,line[i].b,point[a],point[b])) {
  31. return false;
  32. }
  33. }
  34. return true;
  35. }
  36. void addline(double a,double b,double c,double d)
  37. {
  38. line[++ls].a.x = a;
  39. line[ls].a.y = b;
  40. line[ls].b.x = c;
  41. line[ls].b.y = d;
  42. }
  43. void addedge(int u,int v,double dis) { map[u][v] = dis;}
  44. int main(){
  45. //setIO("input");
  46. scanf("%d",&n);
  47. for(int i=1;i<=n;++i) {
  48. double a,b,c,d,x;
  49. scanf("%lf%lf%lf%lf%lf",&x,&a,&b,&c,&d);
  50. point[++idx] = Point(x,a);
  51. point[++idx] = Point(x,b);
  52. point[++idx] = Point(x,c);
  53. point[++idx] = Point(x,d);
  54. addline(x,0,x,a);
  55. addline(x,b,x,c);
  56. addline(x,d,x,10.0);
  57. }
  58. point[++idx] = Point(0,5), st=idx;
  59. point[++idx] = Point(10,5),ed=idx;
  60. for(int i=1;i<=idx;++i)
  61. for(int j=1;j<=idx;++j) map[i][j] = inf;
  62. for(int i=1;i<=idx;++i) map[i][i]=0;
  63. for(int i=1;i<=idx;++i)
  64. for(int j=1;j<i;++j)
  65. if(i!=j&&is_ok(i,j))
  66. addedge(i,j,dis(point[i],point[j])),addedge(j,i,dis(point[i],point[j]));
  67. for(int k=1;k<=idx;++k)
  68. for(int i=1;i<=idx;++i)
  69. for(int j=1;j<=idx;++j)
  70. if(map[i][k]+map[k][j] < map[i][j]) map[i][j] = map[i][k] + map[k][j];
  71. printf("%.2f",map[st][ed]);
  72. return 0;
  73. }

  

luogu P1354 房间最短路问题 计算几何_Floyd_线段交的更多相关文章

  1. [Luogu P1354]房间最短路问题

    这是一道紫题,然而实际上我觉得也就蓝题难度甚至不到. and,这道题就是一道数学题,代码模拟计算过程. 求最短路嘛,肯定要考虑建图,只需要把中间的墙上每个口的边缘处的点作为图中的点就行.至于为什么,显 ...

  2. luogu 1354 房间最短路问题 线段与直线相交 最短路

    题目链接 题目描述 在一个长宽均为10,入口出口分别为(0,5).(10,5)的房间里,有几堵墙,每堵墙上有两个缺口,求入口到出口的最短路经. 输入输出格式 输入格式: 第一排为n(n<=20) ...

  3. P1354 房间最短路问题

    传送门 可以发现,最短路一定要经过墙壁的断点. 那么把房间看作一个有向图,墙壁的断点为节点,求从起点到终点的最短路. 这道题的难点在于建图.枚举所有的断点,若可以走则加入这条边. 判断两点是否连通,即 ...

  4. POJ 1556 The Doors 线段交 dijkstra

    LINK 题意:在$10*10$的几何平面内,给出n条垂直x轴的线,且在线上开了两个口,起点为$(0, 5)$,终点为$(10, 5)$,问起点到终点不与其他线段相交的情况下的最小距离. 思路:将每个 ...

  5. POJ 1556 The Doors(线段交+最短路)

    The Doors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5210   Accepted: 2124 Descrip ...

  6. 最短路+线段交 POJ 1556 好题

    // 最短路+线段交 POJ 1556 好题 // 题意:从(0,5)到(10,5)的最短距离,中间有n堵墙,每堵上有两扇门可以通过 // 思路:先存图.直接n^2来暴力,不好写.分成三部分,起点 终 ...

  7. POJ 3304 Segments 基础线段交判断

    LINK 题意:询问是否存在直线,使得所有线段在其上的投影拥有公共点 思路:如果投影拥有公共区域,那么从投影的公共区域作垂线,显然能够与所有线段相交,那么题目转换为询问是否存在直线与所有线段相交.判断 ...

  8. UVa 10256(凸包、线段交、点在多边形内)

    要点 红蓝点分别求凸包显然 判断两凸包是否相交方法:所有红点不在蓝凸包内,反之亦然:所有红凸包线不与蓝凸包线相交,反之亦然. 书上让特判一下凸包退化成点或线段的情况,为什么我感觉代码仓库的代码并没特判 ...

  9. HDU 4637 Rain on your Fat brother 线段与半圆和线段交 简单题

    题意: 应该不难读懂. 做法: 我们可以把雨滴看做静止不动,然后maze(这题的那个人)就是往左上方运动就可以了,计算出maze能跑到的最远的点,然后就是求起点和终点所构成的线段与每个雨滴交的时间,注 ...

随机推荐

  1. nginx日志按日期自动切割脚本

    #!/bin/bash #nginx日志切割脚本 #author:setevn #设置日志文件存放目录 logs_path="/usr/local/nginx/logs/" #设置 ...

  2. 常用shell备份脚本

    #!/bin/sh # File: /路径/mysql/backup_mydb.sh # Database info DB_NAME="szby" DB_USER="ro ...

  3. 40 最小的K个数(时间效率)

    题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,.   测试用例: 功能测试(输入的数组中有相同的数字:输入的数组中 ...

  4. BZOJ 4367 [IOI2014]holiday (决策单调DP+主席树+分治)

    题目大意:略 题目传送门 神题,不写长题解简直是浪费了这道题 贪心 考虑从0节点出发的情况,显然一直往前走不回头才是最优策略 如果起点是在中间某个节点$s$,容易想到,如果既要游览$s$左边的某些景点 ...

  5. kfka学习笔记一:使用Python操作Kafka

    1.准备工作 使用python操作kafka目前比较常用的库是kafka-python库,但是在安装这个库的时候需要依赖setuptools库和six库,下面就要分别来下载这几个库 https://p ...

  6. java的数组index[]方括号内是可以进行算数运算的

    java的数组index[]方括号内饰可以进行算数运算的 如: String[] stringArray = testString.split("\\."); System.out ...

  7. Java关键字整理之二

    abstrac和interface 一.抽象类:abstract 抽象类就是为了继承而存在的,如果你定义了一个抽象类,却不去继承它,那么等于白白创建了这个抽象类,因为你不能用它来做任何事情.对于一个父 ...

  8. 一个关于 UIPickerView 的 bug

    首先,我下描写叙述一下bug的发生情况: 在使用UIPickerView实现选择城市的时候.出现这样一个Bug 1.在iOS 6的系统上 2.Picker的数据上省份一栏选择了"香港&quo ...

  9. hadoop(七) - hadoop集群环境搭建

    一. 前言: hadoop2.0已经公布了稳定版本号了,添加了非常多特性,比方HDFS HA.YARN等.最新的hadoop-2.4.1又添加了YARN HA 注意:apache提供的hadoop-2 ...

  10. html与JacaScript中的重要思想:预留后路、向后兼容、js分离

    以一个简单的web程序为例 详细设计模式请配合代码及凝视食用 <!DOCTYPE html> <!-- 1 预留退路:假设用户禁用了js.链接还能正常显示吗?(href) 2 分离j ...