POJ 1556 The Doors(判断线段相交 && 最短路)

告别手绘!用Aseprite+Unity Tilemap,从AI生成到2D游戏地图的保姆级搭建流程 本文详细介绍了如何利用Aseprite和Unity Tilemap从AI生成素材到搭建2D游戏地图的完整流程。涵盖AI生成素材的预处理、图层管理、动画制作,以及Unity中的Tilemap系统配置和性能优化技巧,帮助开发者高效创建像素风游戏地图。 阅读详情

The Doors

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

【思路分析】

   这个题目有意思之处在于将计算几何和图论的问题巧妙地结合起来。题意大概是在一个图中给你4 * n + 1个点,其中有一个起点,一个终点以及每一列的四个点,每一列的四个点又构成了三个线段,即隔墙,要求起点到终点的最短路径(当然该路径不能“穿墙”)。该题最关键的就是建图,通过判断两点之间构成的路径是否和隔墙相交来在邻接矩阵中键入权值(即两点之间的路径),要注意的是这里的线段相交要忽视两线段有一个公共端点的情况,即考虑“擦墙而过”,所以两线段不相交时在邻接矩阵中相应位置键入两点之间的距离,若两线段相交则表示此路不通,键入一个无穷大值。当建图好之后就是找最短路了。


代码如下:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define eps 1e-8
#define inf 1e20
#define maxn 150
double maps[maxn][maxn];
double dis[maxn],visited[maxn];
int n;
struct Point
{
    double x,y;
    Point()
    {

    }
    Point(double x1,double y1)
    {
        x = x1;
        y = y1;
    }
    Point operator - (const Point &b) const
    {
        return Point(x - b.x,y - b.y);
    }
    double operator ^ (const Point &b) const
    {
        return x * b.y - y * b.x;
    }
    double operator * (const Point &b) const
    {
        return x * b.x + y * b.y;
    }
}points[maxn];
struct Line
{
    Point s,e;
    Line()
    {

    }
    Line(Point s1,Point e1)
    {
        s = s1;
        e = e1;
    }
}lines[maxn];
int sgn(double x)
{
    if(fabs(x) < eps)
        return 0;
    if(x < 0)
        return -1;
    return 1;
}
double distances(Point p1,Point p2)
{
    return sqrt((p2 - p1) * (p2 - p1));
}
bool intersection(Line l1,Line l2)
{
    return
    max(l1.s.x,l1.e.x) >= min(l2.s.x,l2.e.x) &&
    max(l1.s.y,l1.e.y) >= min(l2.s.y,l2.e.y) &&
    max(l2.s.x,l2.e.x) >= min(l1.s.x,l1.e.x) &&
    max(l2.s.y,l2.e.y) >= min(l1.s.y,l1.e.y) &&
    sgn((l2.s - l1.e) ^ (l1.s - l1.e)) * sgn((l2.e - l1.e) ^ (l1.s - l1.e)) < 0 &&
    sgn((l1.s - l2.e) ^ (l2.s - l2.e)) * sgn((l1.e - l2.e) ^ (l2.s - l2.e)) < 0;
    //注意此处是小于0,即忽视两个线段有一个公共端点的相交情况!
}
void init()
{
    points[0] = Point(0,5);
    for(int i = 1;i <= n;i++)
    {
        double x;
        scanf("%lf %lf %lf %lf %lf",&x,&points[i].y,&points[i + n].y,&points[i + n * 2].y,&points[i + n * 3].y);
        points[i].x = points[i + n].x = points[i + n * 2].x = points[i + n * 3].x = x;
        lines[i] = Line(Point(x,0),points[i]);
        lines[i + n] = Line(points[i + n],points[i + n * 2]);
        lines[i + n * 2] = Line(points[i + n * 3],Point(x,10));
    }
    points[n * 4 + 1] = Point(10,5);
    bool flag = true;
    for(int i = 0;i <= n * 4 + 1;i++)//起点、终点加上每一列的4个点
    {
        for(int j = 0;j <= n * 4 + 1;j++)
        {
            flag = true;
            for(int k = 1;k <= 3 * n;k++)//每列三条线段
            {
                if(intersection(Line(points[i],points[j]),lines[k]))
                {
                    flag = false;
                    break;
                }
            }
            if(flag == true)//两线段不相交
            {
                maps[i][j] = distances(points[i],points[j]);
            }
            else
            {
                maps[i][j] = inf;
            }

        }
    }
}
double dijkstra(int s,int t)
{
    for(int i = 0;i <= n * 4 + 1;i++)
    {
        dis[i] = maps[s][i];
        visited[i] = 0;
    }
    dis[s] = 0;
    visited[s] = 1;
    int temp,k = s;
    for(int i = 1;i <= n * 4 + 1;i++)
    {
        temp = inf;
        for(int j = 0;j <= n * 4 + 1;j++)
        {
            if(visited[j] == 0 && temp > dis[j])
            {
                k = j;
                temp = dis[j];
            }
        }
        if(temp == inf)
            break;
        visited[k] = 1;
        for(int j = 0;j <= n * 4 + 1;j++)
        {
            if(dis[j] > dis[k] + maps[k][j])
                dis[j] = dis[k] + maps[k][j];
        }
    }
    return dis[t];
}
int main()
{
    while(scanf("%d",&n) != EOF && n != -1)
    {
        init();
        printf("%.2lf\n",dijkstra(0,n * 4 + 1));
    }
    return 0;
}


物联网Node-Red开发教程-第6章 HTTP与Web服务 本章摘要(147字): 本章系统讲解了Node-RED中的HTTP节点应用,重点包括: 三大核心HTTP节点功能:http in(接收请求)、http response(返回响应)、http request(调用外部API) 详细演示了REST API开发流程,包括路径参数(req.params)处理和响应构造 提供了创建Hello World API、传感器数据接口等实用示例 涵盖HTTP方法特性、状态码设置及响应头配置等关键知识点 通过流程图和JSON配置直观展示节点连接方式,帮助快速掌握Web服务开发 阅读详情

相关推荐

告别CANoe?手把手教你用Python+PCAN搭建汽车诊断脚本(附完整代码)

本文详细介绍了如何利用Python和PCAN硬件搭建高性价比的汽车诊断自动化方案,替代昂贵的CANoe工具。通过开源库python-can和udsoncan实现UDS诊断协议,涵盖硬件选择、环境配置、核心功能实现及性能优化,附完整代码示例,助力开发者快速构建诊断脚本。

weixin_42551227的博客 373

计算几何——The Doors(Dijkstra和线段相交)

原文链接:http://poj.org/problem?id=1556 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 =...

mumei的博客 344

2025东三省D题深圳杯数学建模实战解析:基于多模型融合的法医STR混合样本智能识别系统

本文深入解析了2025年东三省数学建模竞赛D题,即深圳杯赛题,聚焦于法医STR混合样本的智能识别挑战。文章系统阐述了构建一个基于多模型融合的智能识别系统的完整流程,涵盖贡献者人数判定、DNA贡献比例估计、个体基因型推断以及STR谱图去噪四大核心步骤。通过融合高斯混合模型、随机森林、非负矩阵分解、小波变换与深度学习等多种技术,并强调特征工程的重要性,为破解法医DNA混合样本分析这一行业难题提供了清晰的数学建模与AI实战思路。

weixin_29050271的博客 392

poj1556 The Doors (计算几何+最短路)

The Doors Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11497 Accepted: 4227 Description You are to find the length of the shortest path through a chamber containing obstructing walls. ...

八百标兵奔北坡的博客 303

VLM,VLA,VLN的区别与联系

VLM 提供了理解世界的“眼睛和大脑”,VLN 赋予了这个智能体在空间中“移动的双腿”,而 VLA 则进一步赋予了它“灵巧的双手”来改变世界。三者共同构成了一个完整具身智能体的核心能力模块。

l0409044222的博客 1314

十、强势股的起爆点:第三类买点的实战精解

本文深入解析强势股交易中的第三类买点(三买)实战技巧,涵盖两种经典模式:突破首个中枢后的回踩和底部反转后的直接脱离下跌中枢。通过详细案例和数据分析,揭示三买在捕捉主升浪起爆点时的黄金信号作用,帮助投资者优化风险收益比,提升短线交易成功率。

weixin_30260191的博客 312

POJ-1556 判断相交+dijkstra

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 fina...

刷题记录 199

Oracle19c安装,基本配置教程(超详细)

安装有出错的风险,卸载也是比较麻烦的,所以先提前设置一个还原点,在windows中的步骤如下,如果对自己有信心,可以直接跳过该部分开始安装oracle在设置中进入创建还原点的界面开始创建还原点上面已经成功创建了还原点,如果安装oracle时出现问题,自己也无法解决,恢复到安装之前即可,恢复步骤如下经过上面的步骤,Oracle我们就能够正常使用了,我们就使用自己在sql plus里面创建的账号即可,创建的表会默认存放在我们自己创建的表空间里面。

秃头披风侠的博客 7万+

Closest Pair of Segments HDU - 6697

参考了大佬的题解 https://www.cnblogs.com/dd-bond/p/11391771.html 直接剪枝 #include <iostream> #include <cmath> #include <algorithm> using namespace std; const double eps=1e-8; const double...

leekerian的博客 357

新手必看:C#调用YOLO模型完成图片/视频目标检测(上位机版)

新手学习C#调用YOLO模型,核心是先把基础流程跑通,再逐步优化。图片检测是基础,视频检测就是在图片的基础上加循环和线程,而上位机的实际项目,就是在这个基础上适配工业硬件和业务需求。本文的代码都是新手能直接复制运行的,如果你运行时遇到问题,先检查前期准备是否到位,再看避坑指南。记住,新手别追求一步到位,先实现功能,再慢慢优化性能和界面。等你能熟练调用YOLO模型后,再去研究模型训练、量化优化等进阶内容,会轻松很多。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 988

CKS-CN考试之路----11

显然是alpine-b的镜像有libcrypto3-3.1.4-r5。新版本发布老版本会被回收,此时pod只剩下2个container。我们依次测试是哪个镜像里包含libcrypto3。可以看到alpine的pod有3个副本.

Q先生 652

【跨立实验-非严格相交】poj1556

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 ...

SummerDream 269

【云原生技术】sonar的官方web接口,获取质量阀结果的接口

以下是一个示例思路,说明如何调用 SonarQube 的质量阀查询接口并在前端展示“哪些条件没过”。假设前端使用 AJAX 或 fetch 从后端接口拿到 SonarQube 返回的 JSON(或直接前端请求 SonarQube API),前端再把解析结果展示给用户。测试覆盖率 (Coverage) 当前仅有 60%,未满足最低 80% 的要求,需要补充测试或优化以提升覆盖率。接口),就会返回相应的质量阀状态信息;里使用它来查询当前质量阀(质量门)的状态。,你用它即可获取该次分析的质量阀状态。

weixin_46453070的博客 1279

POJ 1556 The Doors

POJ 1556 The Doors 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. T...

旺崽的博客 2917

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

POJ 1556 The Doors (判断线段相交+dijkstra)

The Doors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7392   Accepted: 2900 Description You are to find the length of the shortest path through a chamber c

滴水穿石,慢慢积累,总会有成果 579

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【解题报告】 POJ 1556 The Doors -- 最短路问题 Dijkstra算法 + 直线相交

题目连接:POJ 1556 题目大意:从房间的坐标(0,5) -> (10,5),中间经过最多不超过18个墙,求路径最短。 这道题在nyoj上AC不了,貌似数据中墙会重复输入 ( waiting... ) // POJ 1556 The Doors -- 最短路问题 Dijkstra算法 + 直线相交 // PS : 自我感觉Dijkstra算法类似于 BFS // /*test data

生命有一种绝对 818

POJ_1556_The Doors_判断线段相交+最短路

POJ_1556_The Doors_判断线段相交+最短路 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 ...

168

POJ - 1556 The Doors

http://poj.org/problem?id=1556 几何+最短路 先算出所有的n*4+2个点和3*n个边界,然后每次从n*4+2个点中取两个点,判断一下这两个点构成的线段是否与3*n个边界相交,如果不相交,那么表示“这条路”是可以走的,就加边,否则不加边,然后跑一遍最短路。 poj输出要%f,%lf 会错。 #include <iostream> #includ...

JZK-Keven 的博客 438

POJ - 1556 The Doors(线段相交+最短路)

题目链接:点击查看 题目大意:给出一个房间,房间内有许多墙壁(最多18堵墙),现在要从(0,5)点到(10,5)点,问最短路程是多少 题目分析:若要使路程最短,肯定要在两点之间前进,这样我们可以在建好墙后,根据线段相交问题渐变,判断两个点之间是否有线段挡着,如果没有挡着,直接建边,边权为两点的直线距离,如果被挡着了,也就是存在一条线段和当前线段规范相交,则说明两点无法直接到达,则边权置为无穷大...

Falcon的博客 412

POJ 1556 The Doors 点与线段交+最短路

题目链接:http://poj.org/problem?id=1556 题目大意:一个房间里有很多墙,每道墙上有两个门,求从房间左边中点到右边中点的最短距离。如图:   这道题目说起来就是一道最短路的题,但是两点之间是否能够走,需要判断一下两点之间的连线是不是跟墙有交点,就是计算几何的判断线段相交问题。两类典型的题合在一起了。 由于数据范围小的可怜,无脑暴力+floyd都能

foreyes_1001的博客 458

【POJ 1556】The Doors

1.题目链接。首先这个题目的输入有点迷,为了把问题描述清楚也是不容易。然后就是POJ的小数问题,输出采用%.2f,%.2lf依然是错的。 2.具体的做法就是把每个点拿出来,然后跑最短路。我们需要判断线段之间是不是相交,这中间可以采用一个小技巧,我们把每一堵墙中间的空隙拿出来存着,然后对于每一条路判断是不是与这些空隙相交,如果相交,说明这条路是可用的,否则不可用。这样看来其实spfa是很合适来求这...

YG爱木木 262

POJ 1556(The Doors )计算几何(线段相交)+最短路

题意: 要求的是在一个空间内有许多墙,每个墙上有两扇门你要从最左边中点去最右边中点的最短路。 思路: 把每扇门看作是两个点然后利用计算几何的知识来判断一下两个点所形成的线段与图中的墙(也就是线段)有没有相交,规范相交与重合才算相交,对于不相交的两个点之间建立边,然后跑最短路就可以了。 细节请见代码注释。 #include<iostream> #include<cstdio>...

laaahu的博客 516

The Doors POJ1556 线段相交 最短路

题目链接 解法:暴力判断任意两点是否可直达,并求出距离 处理完后用floyd算法求任意两点最短路 输出dis[0][4*n+1]即可 #include <map> #include <set> #include <cmath> #include <queue> #include <cstdio> #include ...

郭源潮 205

POJ 1556 The Doors【单源最短+线段相交】

点击打开链接 题意: 给你一个10*10的方格, 然后在里面放不超过十堵墙。然后问你从 (0,5)->(10,5)的最短路。 题解: 最短路,但是建图非常恶心,需要判断线段之间是否相交。不相交才能建边。 判断两线段是否相交。模板 double mult(Point a, Point b, Point c) { return (a.x-

zoro_n的博客 368

poj-1556-The Doors-dij+线段相交

计算几何:求两条线段是否相交。 求两条线段是否相交只需要求两条线段的两个短点是否都在另外一条线段的两侧即可。 图论:dij求最短路 #include #include #include #include #include using namespace std; #define maxn 200000 #define eps 0.00001 #define zero(x) ((fabs(x)

青竹梦 1243

POJ 1556 The Doors(判断线段相交+最短路)

题目链接 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 point...

Happig的博客 240

POJ - 1556 The Doors(判断线段与线段相交模板+最短路)

链接:https://cn.vjudge.net/problem/POJ-1556 题意:在一个10*10矩形内,有一些竖着的墙,问从(0,5)到(10,5)的最短距离。 思路:由于墙的个数很少,把不是墙的线段存下来,再把不是墙的线段两端的点存下来。判断线段相交建图,跑最短路。 #include <cstdio> #include <iostream> #inclu...

birdmanqin的博客 180
上一篇: ZOJ 3778 Talented Chef
下一篇: FZU 2197 最小花费
Spectacules
博客等级 码龄12年 2粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值