#P1556. The Doors

    ID: 557 传统题 1000ms 256MiB 尝试: 3 已通过: 1 难度: 5 上传者: 标签>图结构最短路Dijkstra计算几何难度普及+/提高Mid-Central USA 1996

The Doors

问题描述

我们需要计算在一个包含障碍墙的密闭空间内,从起点(0,5)(0,5)到终点(10,5)(10,5)的最短路径长度。该密闭空间的边界固定为x=0x=0x=10x=10y=0y=0y=10y=10。空间内部可能包含001818道垂直墙壁,每道墙上有两个门洞。

示例说明

图示密闭空间对应的输入数据为:

2
4 2 7 8 9
7 3 4.5 6 7

其中最短路径长度计算结果为10.0610.06(如原题图示)

输入格式

  • 多组测试数据,以1-1结束
  • 每组数据:
    • 第一行:墙壁数量nn0n180 \leq n \leq 18
    • 接下来nn行:每行描述一道墙,包含55个实数:
      • 第一个数:墙壁的xx坐标(0<x<100 < x < 10
      • 后四个数:门洞的yy坐标端点(按升序排列)
  • 墙壁xx坐标按升序排列

输出格式

  • 对每组数据输出一行,表示最短路径长度(保留两位小数)

输入输出示例

输入

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

输出

10.00
10.06

计算原理

  1. 空间建模:将密闭空间视为二维平面,边界为x[0,10]x \in [0,10]y[0,10]y \in [0,10]
  2. 障碍处理:每道垂直墙WiW_ix=xix=x_i处,门洞范围为[yi1,yi2][y_{i1},y_{i2}][yi3,yi4][y_{i3},y_{i4}]
  3. 路径规划:通过门洞的连通性计算最短路径,需满足:
    • 路径由直线段组成
    • 每段直线必须穿过有效门洞
    • 路径总长度L=(xk+1xk)2+(yk+1yk)2L = \sum \sqrt{(x_{k+1}-x_k)^2 + (y_{k+1}-y_k)^2}

实现要求

程序需要处理多组测试数据,对每组数据:

  1. 解析墙壁和门洞信息
  2. 构建可达性图(将门洞端点作为节点)
  3. 应用图搜索算法(如Dijkstra算法)计算最短路径
  4. 输出结果保留两位小数

注意:当n=0n=0时,最短路径即为直线距离(100)2+(55)2=10.00\sqrt{(10-0)^2 + (5-5)^2} = 10.00