The Doors

Time Limit: 1000 MS Memory Limit: 10000 KB

64-bit integer IO format: %I64d , %I64u   Java class name: Main

[Submit] [Status] [Discuss]

Description

You are to find the length of the shortest path through a chamber containing obstructing walls. The chamber will always have sides at x = 0, x = 10, y = 0, and y = 10. The initial and final points of the path are always (0, 5) and (10, 5). There will also be from 0 to 18 vertical walls inside the chamber, each with two doorways. The figure below illustrates such a chamber and also shows the path of minimal length. 

Input

The input data for the illustrated chamber would appear as follows.
2  4 2 7 8 9  7 3 4.5 6 7
The first line contains the number of interior walls. Then there is a line for each such wall, containing five real numbers. The first number is the x coordinate of the wall (0 < x < 10), and the remaining four are the y coordinates of the ends of the doorways in that wall. The x coordinates of the walls are in increasing order, and within each line the y coordinates are in increasing order. The input file will contain at least one such set of data. The end of the data comes when the number of walls is -1.

Output

The output should contain one line of output for each chamber. The line should contain the minimal path length rounded to two decimal places past the decimal point, and always showing the two decimal places past the decimal point. The line should contain no blanks.

Sample Input

1
5 4 6 7 8
2
4 2 7 8 9
7 3 4.5 6 7
-1

Sample Output

10.00
10.06
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <cmath> using namespace std;
#define maxx 100
#define INF 10000000 struct Node
{
double x;
double y;
} p[maxx]; ///每扇门的终点 起点 和门的两个端点的平面坐标 struct EDGE
{
int u;
int v;
} Edge[maxx*maxx]; ///存构造的边 因为之前是孤立的点 int n; ///n个墙
double wX[]; ///输入每堵墙的横坐标
double py[][]; ///每堵墙横坐标对应的纵坐标 0 1 2 3 double g[maxx][maxx]; ///存邻接矩阵 配合dis[]的
double dis[maxx]; ///beg到其他点的最短距离 int Psize; ///边的数量
int Esize; ///点的数量 double Dis(Node a,Node b) ///计算亮点之间的距离
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
} double cross(double x1,double y1,double x2,double y2,double x3,double y3) ///判断(x3,y3)与(x1,y1)(x2,y2)是否交叉
{
return (x2-x1)*(y3-y1)-(x3-x1)*(y2-y1);
} bool IsOk(Node a,Node b) ///判断两点之间是否可以连线
{
if(a.x>=b.x)
return false;
bool falg=true;
int i=;
while(wX[i]<=a.x&&i<n)
i++;
while(wX[i]<b.x&&i<n)
{
if(cross(a.x,a.y,b.x,b.y,wX[i],)*cross(a.x,a.y,b.x,b.y,wX[i],py[i][])<
||cross(a.x,a.y,b.x,b.y,wX[i],py[i][])*cross(a.x,a.y,b.x,b.y,wX[i],py[i][])<
||cross(a.x,a.y,b.x,b.y,wX[i],py[i][])*(cross(a.x,a.y,b.x,b.y,wX[i],))<)
{
falg=false;
break;
}
i++;
}
return falg;
} double Bellman(int beg,int end)
{
for(int i=;i<maxx;i++)
dis[i]=INF;
dis[beg]=;
bool EX=true;
for(int i=;i<=Psize&&EX;i++)
{
EX=false;
for(int j=;j<Esize;j++)
{
if(dis[Edge[j].u]<INF&&dis[Edge[j].v]>(dis[Edge[j].u]+g[Edge[j].u][Edge[j].v]))
{
dis[Edge[j].v]=(dis[Edge[j].u]+g[Edge[j].u][Edge[j].v]);
EX=true;
}
}
}
return dis[end];
} int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==-)
break;
p[].x=;
p[].y=;
Psize=;
for(int i=; i<n; i++)
{
cin>>wX[i];
for(int j=; j<; j++)
{
p[Psize].x=wX[i];
cin>>p[Psize].y;
py[i][j]=p[Psize].y;
Psize++;
}
}
p[Psize].x=;
p[Psize].y=;
for(int i=; i<=Psize; i++)
{
for(int j=; j<=Psize; j++)
{
g[i][j]==INF;
}
}
Esize=;
for(int i=; i<=Psize; i++)
{
for(int j=i+; j<=Psize; j++)
{
if(IsOk(p[i],p[j]))
{
g[i][j]=Dis(p[i],p[j]);
Edge[Esize].u=i;
Edge[Esize].v=j;
Esize++;
}
}
}
printf("%.2lf\n",Bellman(,Psize));
}
return ;
}

poj 1556 The Doors的更多相关文章

  1. POJ 1556 - The Doors 线段相交不含端点

    POJ 1556 - The Doors题意:    在 10x10 的空间里有很多垂直的墙,不能穿墙,问你从(0,5) 到 (10,5)的最短距离是多少.    分析:        要么直达,要么 ...

  2. POJ 1556 The Doors 线段交 dijkstra

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

  3. POJ 1556 - The Doors - [平面几何+建图spfa最短路]

    题目链接:http://poj.org/problem?id=1556 Time Limit: 1000MS Memory Limit: 10000K Description You are to f ...

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

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

  5. poj 1556 The Doors(线段相交,最短路)

      The Doors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7430   Accepted: 2915 Descr ...

  6. POJ 1556 The Doors 线段判交+Dijkstra

    The Doors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6734   Accepted: 2670 Descrip ...

  7. POJ 1556 The Doors【最短路+线段相交】

    思路:暴力判断每个点连成的线段是否被墙挡住,构建图.求最短路. 思路很简单,但是实现比较复杂,模版一定要可靠. #include<stdio.h> #include<string.h ...

  8. POJ 1556 The Doors --几何,最短路

    题意: 给一个正方形,从左边界的中点走到右边界的中点,中间有一些墙,问最短的距离是多少. 解法: 将起点,终点和所有墙的接触到空地的点存下来,然后两两之间如果没有线段(墙)阻隔,就建边,最后跑一个最短 ...

  9. 简单几何(线段相交+最短路) POJ 1556 The Doors

    题目传送门 题意:从(0, 5)走到(10, 5),中间有一些门,走的路是直线,问最短的距离 分析:关键是建图,可以保存所有的点,两点连通的条件是线段和中间的线段都不相交,建立有向图,然后用Dijks ...

随机推荐

  1. ios8 滚动事件解放了

    http://developer.telerik.com/featured/scroll-event-change-ios-8-big-deal/ 这是外国人写的一篇文章,我这里直接贴了一个链接,敢兴 ...

  2. 路由器WDS实际案例

    背景环境: 我家在农村,由于是农村,虽然现在村里迁了网线,但是用户毕竟还是很少的,我家常年都在外面打工,就过年过节回来十几二十天,想上网,不值得迁网线,所以选择不道德的蹭网. 由于手机的信号并没有专业 ...

  3. Python之路【第十六篇】:Django【基础篇】

    Python之路[第十六篇]:Django[基础篇]   Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...

  4. 移动端自动化环境搭建-JDK的安装

    一.安装jdk A.安装依赖 JDK作为JAVA开发的环境,不管是做JAVA开发的学生,还是做安卓开发的同学,都必须在电脑上安装JDK. B.安装过程 安装JDK 选择安装目录 安装过程中会出现两次 ...

  5. C# 定制 Attribute 简单使用

    所谓 “定制Attribute”,就是一个类的实例,它被序列化成驻留在元数据的一个字节流. 我们可以使用 Attribute 来保存注释: namespace AttributeDemo { [Att ...

  6. C/C++关键字 extern

    1.基本解释:extern 可置于变量或函数前面,表示变量或函数的定义在别的文件中,以提示编译器遇到此变量或函数时在其他模块中寻找定义. extern还有另外2个作用.第一:与“C”连用时,如 ext ...

  7. MySQL安装常见问题(找不到文件,系统服务无法启动...)

    在安装mysql时总是会遇到问题,每次重新安装都会花很多时间来排查.在网上其实有很多相关的文章,但很多都只讲了方法,但没讲具体细节问题,导致无法解决问题.其实有时候知道问题的原因,但总是因为一些细节问 ...

  8. 技术英文单词贴--D

    D detail 细节,详情 deploy 配置,部署

  9. Scrum会议10.19

    Scrum会议 组名称:好好学习 项目名称:记账本 参会成员:林莉(Master)胡丽娜 宫丽君 汪东涵 时间:2016.10.19 已完成内容: 1.完成新项目的查找,查找学姐的代码和项目. 2.理 ...

  10. 转发(request.setRequestDispacter)和重定向(response.sendRedirect)的区别以及转发的include和forward的区别

    //response 重定向的时候,url是会跳转到新的页面的,输入的地址要包含项目名(可以跳到项目之外的页面,比如百度)//request 请求转发的时候,url是不会跳转到新页面的,输入的地址不包 ...