http://poj.org/problem?id=1556

题目大意:从(0,5)走到(10,5)走的最短距离是多少

中间有最多18个隔着的墙  每个墙都有两个门  你只能从门通过

我的思路是  只要这两个点把能过的   就把他们的距离算出来  最后用迪杰斯塔拉算法求最短路就行了

  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<stdlib.h>
  4. #include<ctype.h>
  5. #include<math.h>
  6. #include<algorithm>
  7. #include<iostream>
  8.  
  9. using namespace std;
  10. #define N 200
  11. const double ESP = 1e-;
  12. #define INF 0xffffffff
  13. int vis[N];
  14. double dis[N];
  15. struct node
  16. {
  17. double x,y;
  18. int c;
  19. node(double x=,double y=,int c=):x(x),y(y),c(c){}
  20. }p[N];
  21. node a[N][];
  22.  
  23. double G[N][N];
  24.  
  25. double dij(int s,int e)
  26. {
  27. memset(vis,,sizeof(vis));
  28. for(int i=;i<e;i++)
  29. {
  30. dis[i]=G[s][i];
  31. }
  32. for(int i=;i<e;i++)
  33. {
  34. double Min=INF;
  35. int dist;
  36. for(int j=;j<e;j++)
  37. {
  38. if(!vis[j] && Min>dis[j])
  39. {
  40. Min=dis[j];
  41. dist=j;
  42. }
  43. }
  44. vis[dist]=;
  45. for(int j=;j<e;j++)
  46. {
  47. if(!vis[j])
  48. dis[j]=min(dis[j],dis[dist]+G[dist][j]);
  49. }
  50. }
  51. return dis[e-];
  52. }
  53.  
  54. int main()
  55. {
  56. int n;
  57. double k[N];
  58. while(scanf("%d",&n),n!=-)
  59. {
  60. p[]=node(,,);
  61. int b=;
  62. for(int i=;i<=n;i++)
  63. {
  64. scanf("%lf",&k[i]);
  65. scanf("%lf %lf %lf %lf",&a[i][].x,&a[i][].y,&a[i][].x,&a[i][].y);
  66. p[b++]=node(k[i],a[i][].x,i);
  67. p[b++]=node(k[i],a[i][].y,i);
  68. p[b++]=node(k[i],a[i][].x,i);
  69. p[b++]=node(k[i],a[i][].y,i);
  70. }
  71. p[b++]=node(,,n+);
  72. for(int i=;i<b;i++)
  73. {
  74. for(int j=;j<b;j++)
  75. {
  76. G[i][j]=INF;
  77. }
  78. dis[i]=INF;
  79. }
  80. for(int i=;i<b;i++)
  81. {
  82. for(int j=i+;j<b;j++)
  83. {
  84. if(p[i].c == p[j].c)
  85. continue;
  86. int flag=;
  87. for(int l=p[j].c-; l>p[i].c; l--)
  88. {
  89. double y=(k[l]-p[i].x)*(p[j].y-p[i].y)/(p[j].x-p[i].x)+p[i].y;
  90. if(a[l][].x-y>ESP || (a[l][].y-y<ESP && a[l][].x-y>ESP) || (a[l][].y-y<ESP))
  91. {
  92. flag=;
  93. break;
  94. }
  95. }
  96. if(flag==)
  97. {
  98. G[i][j]=sqrt((p[j].x-p[i].x)*(p[j].x-p[i].x)+(p[j].y-p[i].y)*(p[j].y-p[i].y));
  99. }
  100. }
  101. }
  102. double aa=dij(,b);
  103. printf("%.2f\n",aa);
  104. }
  105. return ;
  106. }

The Doors--poj1556(最短路+判断点与线段的关系)的更多相关文章

  1. POJ1556 最短路 + 线段相交问题

    POJ1556 题目大意:比较明显的题目,在一个房间中有几堵墙,直着走,问你从(0,5)到(10,5)的最短路是多少 求最短路问题,唯一变化的就是边的获取,需要我们获取边,这就需要判断我们想要走的这条 ...

  2. Broken line - SGU 124(判断点与多边形的关系)

    题目大意:RT 分析:构造一条射线,如果穿越偶数条边,那么就在多边形外面,如果穿越奇数条边,那么就在多边形里面. 代码如下: ===================================== ...

  3. 判断直线与线段相交 POJ 3304 Segments

    题意:在二维平面中,给定一些线段,然后判断在某直线上的投影是否有公共点. 转化,既然是投影,那么就是求是否存在一条直线L和所有的线段都相交. 证明: 下面给出具体的分析:先考虑一个特殊的情况,即n=1 ...

  4. C# GDI+ 利用 Rectangle GraphicsPath 判断 矩形或多边形 图形关系

    最近在做一些简单的图像对比工作,总结了一些GDI+对象的使用方式,记录下来共享给大家使用. 判断Rectangl与多边形的关系 /// <summary> /// 是否包含输入范围 /// ...

  5. .NET(C#):判断Type类的继承关系

    //Type类的函数 class Type bool IsInstanceOfType(object); //判断对象是否是指定类型 //类型可以是父类,接口 //用法:父类.IsInstanceOf ...

  6. POJ 3304 Segments (判断直线与线段相交)

    题目链接:POJ 3304 Problem Description Given n segments in the two dimensional space, write a program, wh ...

  7. POJ 3304 Segments(判断直线与线段是否相交)

    题目传送门:POJ 3304 Segments Description Given n segments in the two dimensional space, write a program, ...

  8. POJ 1584 A Round Peg in a Ground Hole 判断凸多边形 点到线段距离 点在多边形内

    首先判断是不是凸多边形 然后判断圆是否在凸多边形内 不知道给出的点是顺时针还是逆时针,所以用判断是否在多边形内的模板,不用是否在凸多边形内的模板 POJ 1584 A Round Peg in a G ...

  9. POJ1556 The Doors 叉积+最短路

    题目大意:求从(0,5)到(10,5)的最短距离,起点与终点之间有n堵墙,每个墙有2个门. 题目思路:判断两点间是否有墙(判断两点的连线是否与某一堵墙的线段相交),建立一个图,然后最短路求出就可以了. ...

随机推荐

  1. LibreOJ #119. 最短路 (堆优化dijkstra)

    题目描述 给一个 n(1≤2500≤n) n(1 \leq 2500 \leq n)n(1≤2500≤n) 个点 m(1≤6200≤m) m(1 \leq 6200 \leq m)m(1≤6200≤m ...

  2. 伪类的格式重点:父标签层级 & 当前标签类型

    伪类的格式重点:父标签层级 & 当前标签类型 通过例子说明: css1: span:nth-of-type(2){color: red;} css2: span :nth-of-type(2) ...

  3. docker 创建容器与管理容器

    创建容器的选项 [root@mast ~]# docker container run --help Usage: docker container run [OPTIONS] IMAGE [COMM ...

  4. python猜年龄游戏升级版

    猜年龄游戏升级版 要求:允许用户最多尝试3次,每尝试3次后,如果还没猜对,就问用户是否还想继续玩,如果回答Y,就继续让其猜3次,以此往复,如果回答N,就退出程序,如何猜对了,就直接退出 age = 1 ...

  5. mosquitto linux部署

    1:官网下载 https://mosquitto.org/files/source/ 本文使用的是mosquitto-1.5.tar.gz 2:解压mosquitto-1.5.tar.gz tar - ...

  6. spring中注解的实现原理

    @Autowired和@Resource的区别: 在Java中使用@Autowired和@Resource注解进行装配,这两个注解分别是:1.@Autowired按照默认类型(类名称)装配依赖对象,默 ...

  7. 记一次Linux系统被入侵的过程

    记一次Linux系统被入侵的过程 1. 前期现象 前期现象,宋组那边反应开发环境192.161.14.98这台机器通过公网下载文件,很慢,ping百度丢包严重.因为这台机器是通过楼下adsl拨号上网, ...

  8. Ztree 多选,显示勾选的路径

    项目要求,需要向后台传递已经勾选的路径,如 l1-a, l1-l3-c,l1-l3-d;(如果是全选状态则只传递全选状态的路径,不传子节点). 具体可以参考jQ  Ztree 的 v3.5 版本 Me ...

  9. 35个Redis面试题

    1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...

  10. sin_addr.s_addr和sin_addr.S_un.S_addr

    sin_addr.s_addr和sin_addr.S_un.S_addr 先mark一下,等下写