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 ...
随机推荐
- [winserver]设置Server2008R2远程桌面允许每个用户运行多个会话
首先打开"服务器管理器",选择"角色"-在对话框右边部分选择"添加角色" 根据提示一步步安装即可. 然后在角色中找到"远程桌面服务 ...
- UVa 10300 - Ecological Premium
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=94&page=s ...
- VC++ MFC子对话框建立与关闭
主窗体 void CMoshiwindowDlg::OnButton1() { // TODO: Add your control notification handler code here CDi ...
- bs4的学习
soup = BeautifulSoup(html,'html.parser') #'html.parser'是html解析器必须有soup.find_all("a") #等价于 ...
- asp.net GridView控件的列属性
BoundField 默认的数据绑定类型,通常用于显示普通文本 CheckBoxField 显示布尔类型的数据.绑定数据为TRUE时,复选框数据绑定列为选中状态:绑定数据为FALSE时,则显示未选中状 ...
- Linux/Unix双机建立信任教程
Linux/Unix双机建立信任教程 一 需要建立信任关系的2台主机都执行生成密钥输入ssh-keygen -t rsa之后全部默认回车,这样就会在/root/.ssh下生成密钥文件 [root@pl ...
- PHP 判断是否为Get/Post/Ajax提交
<?php PHP 判断是否为Get/Post/Ajax提交 /** * 是否是AJAx提交的 * @return bool */ function isAjax(){ if(isset($_S ...
- [转] 关于linux下通过shell命令(自动)修改用户密码
关于linux下通过shell命令(自动)修改用户密码 2012-04-23 18:47:39 分类: 原文地址:关于linux下(自动)修改用户密码 作者:ubuntuer 本文章总结了如何手动.自 ...
- quick-cocos2d-x之testlua之mainMenu.lua
require "helper" require "testResource" require "ActionsTest.ActionsTest&qu ...
- Odoo启动过程
[本文基于odoo9源码编写] odoo包含的服务有 db object report workflow web[wsgi] Odoo以wsgi 规范提供Web及Web服务db/object/repo ...