理解题意:
1. 模型抽象
赛道 = 若干矩形的并集,区域连通;智能车只能在并集内部行驶,求 S 到 T 最短路径。几何性质:区域内最短路径拐点只能出现在相邻矩形公共竖边的上下端点。
2. 建图节点集合
节点包含:
起点 S、终点 T;
每一段相邻矩形公共竖直边的两个端点。上图公共竖边端点:(2,1)、(2,2)。本例节点列表:S(1,1), T(3,0), P1 (2,1), P2 (2,2)。
3. 连边规则
对任意两个节点 A,B:判断线段 AB 全部落在矩形并集内部,满足则连无向边,边权为两点欧氏距离。本例有效连线:S↔P1 ,P1 ↔T,S 不能直接连 T(线段穿过赛道外部)。
4. 求最短路
所有节点构建无向图,使用Dijkstra 算法求出起点到终点的最短路径长度 L。答案时间=vL
5. 关键子问题:线段检验
给定线段 PQ,判断整条线段是否完全被矩形的并覆盖:线段上任意一点 (x,y),至少存在一个矩形,满足:xi1 ≤x≤xi2 ,yi1 ≤y≤yi2 实现上可以采样检验,或者参数化离散判断。
样例完整演算
节点:S(1,1),P1(2,1),P2(2,2),T(3,0)有效边:
S−P1,长度 1
P1−P2,长度 1
P1−T,长度 2 ≈1.41421356
最短路径:S→P1→T总长 1+2 ≈2.41421356,v=1,输出 2.41421356。
实现要点
收集所有候选拐点(公共竖边端点);
枚举所有节点两两配对,线段合法性检测;
Dijkstra 求最短路径;
路径长度除以速度得到时间,输出至少 6 位小数。
易错提醒
不能直接两点直线!直线可能穿出赛道区域;
拐点只需要公共竖边端点,不需要枚举矩形所有顶点,大幅减少节点数量;
浮点数运算注意精度,输出保证不少于 6 位小数。
代码: