poj 1556 The Doors
The Doors
Time Limit: 1000 MS Memory Limit: 10000 KB
64-bit integer IO format: %I64d , %I64u Java class name: Main
Description

Input
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
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的更多相关文章
- POJ 1556 - The Doors 线段相交不含端点
POJ 1556 - The Doors题意: 在 10x10 的空间里有很多垂直的墙,不能穿墙,问你从(0,5) 到 (10,5)的最短距离是多少. 分析: 要么直达,要么 ...
- POJ 1556 The Doors 线段交 dijkstra
LINK 题意:在$10*10$的几何平面内,给出n条垂直x轴的线,且在线上开了两个口,起点为$(0, 5)$,终点为$(10, 5)$,问起点到终点不与其他线段相交的情况下的最小距离. 思路:将每个 ...
- POJ 1556 - The Doors - [平面几何+建图spfa最短路]
题目链接:http://poj.org/problem?id=1556 Time Limit: 1000MS Memory Limit: 10000K Description You are to f ...
- POJ 1556 The Doors(线段交+最短路)
The Doors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5210 Accepted: 2124 Descrip ...
- poj 1556 The Doors(线段相交,最短路)
The Doors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7430 Accepted: 2915 Descr ...
- POJ 1556 The Doors 线段判交+Dijkstra
The Doors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6734 Accepted: 2670 Descrip ...
- POJ 1556 The Doors【最短路+线段相交】
思路:暴力判断每个点连成的线段是否被墙挡住,构建图.求最短路. 思路很简单,但是实现比较复杂,模版一定要可靠. #include<stdio.h> #include<string.h ...
- POJ 1556 The Doors --几何,最短路
题意: 给一个正方形,从左边界的中点走到右边界的中点,中间有一些墙,问最短的距离是多少. 解法: 将起点,终点和所有墙的接触到空地的点存下来,然后两两之间如果没有线段(墙)阻隔,就建边,最后跑一个最短 ...
- 简单几何(线段相交+最短路) POJ 1556 The Doors
题目传送门 题意:从(0, 5)走到(10, 5),中间有一些门,走的路是直线,问最短的距离 分析:关键是建图,可以保存所有的点,两点连通的条件是线段和中间的线段都不相交,建立有向图,然后用Dijks ...
随机推荐
- 0601 Spring2.0 发布会及产品发展方向
ProductBacklog:继续向下细化; 1.界面美化,统一界面风格,以简洁美观为主: 2.丰富版面的内容,吸引用户: 3.尝试增加新的版面: Sprint 计划会议:确定此次冲刺要完成的目标 1 ...
- JAVA编程规则【转自java编程思想】
本附录包含了大量有用的建议,帮助大家进行低级程序设计,并提供了代码编写的一般性指导: (1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在 ...
- CSS盒子模型学习记录3(侧面导航栏)
学习http://www.blueidea.com/tech/web/2007/4545_2.asp 代码试验 html <!DOCTYPE html PUBLIC "-//W3C// ...
- 解决OneNote的无法同步的问题
微软的OneNote一直是我比较喜欢的笔记软件,一些复杂的笔记用它来存储比Evernote要强大很多,然而这几天发现一直无法同步,登陆https://onedrive.live.com/看了一下,发现 ...
- Java遍历JSON
JSONObject jsonObject = new JSONObject(s);然后用Iterator迭代器遍历取值,建议用反射机制解析到封装好的对象中 JSONObject jsonObject ...
- Scala class的构造方法与继承
有java背景的人,很清楚java是如何定义构造方法以及继承的.在scala里面,继承和java有些相似.但是构造方法的定义,就不大一样了,应该说是差别还是很大的.在java里面,定义构造方法,就是定 ...
- codevs4919 线段树练习4
4919 线段树练习4 时间限制: 1 s 空间限制: 128000 KB 题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]内的所有数都增加X 2:询问区 ...
- GsonWithoutObject 没有对象(脱离对象) 直接提取 ... gson json
GsonWithoutObject 脱离对象, 直接提取 package temp; import tool.FileTool; import com.google.gson.JsonElement; ...
- linux系统man命令用法和安装方法
Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可. Linux的man手册共有以下几个章节: 代號 代表內容 1 使用者在shell中可以操作的指令或可 ...
- Linux上安装php
1.安装mysql http://blog.csdn.net/wy3552128/article/details/8143686 2.安装配置Apache http://blog.csdn.net ...