题目描述
给出一个在二维平面直角坐标系第一象限内的,单位长度为1的无限大网格,每条直线都代表道路。又给你一条直线ax+by+c=0,也代表一条道路。
现在给你两个格点A,B坐标(x1,y1)和(x2,y2),让你求该两点间最短的道路距离。
输入
第一行a,b,c表示直线ax+by+c=0
第二行x1,y1,x2,y2表示A(x1,y1),B(x2,y2)的坐标
输出
求A,B间最短的道路距离(误差不超过10^−6)
">Barcelonian Distance
Barcelonian Distance
Created by LXC on Fri Feb 23 00:24:48 2024
https://codeforces.com/problemset/problem/1032/D
ranting: 1900
tag: geometry, implementation
problem
题目描述
给出一个在二维平面直角坐标系第一象限内的,单位长度为1的无限大网格,每条直线都代表道路。又给你一条直线ax+by+c=0,也代表一条道路。
现在给你两个格点A,B坐标(x1,y1)和(x2,y2),让你求该两点间最短的道路距离。
输入
第一行a,b,c表示直线ax+by+c=0
第二行x1,y1,x2,y2表示A(x1,y1),B(x2,y2)的坐标
输出
求A,B间最短的道路距离(误差不超过10^−6)
solution
$(x1,y1)$ 到 $(x2, y2)$ 的移动方式,在经过直线是可以沿着直线走,否则只能水平或竖直移动。
分两种情况
不经过直线$ax+by+c=0$,那么他们的距离是曼哈顿距离$|x1-x2|+|y1-y2|$
经过直线$ax+by+c=0$,由于点$(x,y)$存在两种方式到达直线,交点分别是$(x, (-c-ax)/b),((-c-by)/a, x)$。存在4种不同移动方案,只需维护4种方案的最小值就是经过直线情况的最小值。
两种情况的最小值就是答案。
吐槽一下x1, x2, y1, y2
作为全局变量似乎与c++自带的库冲突了
code
1 |
|