CF1547A Shortest Path with Obstacle 题解

Content

给定两个在二维平面上的网格 \(A(x_A,y_A)\)\(B(x_B,y_B)\),另外,还有一个不可通过的网格 \(F(x_F,y_F)\)。你需要求出在不经过 \(F\) 的情况下,通过若干次上下左右的移动,从 \(A\) 走到 \(B\) 的最短路径长度。

数据范围:\(t\) 组数据,\(1\leqslant t\leqslant 10^4\)\(1\leqslant x_A,y_A,x_B,y_B,x_F,y_F\leqslant 1000\)

Solution

我们不妨先抛开 \(F\) 不谈,先想想,如果直接问你从 \(A\) 走到 \(B\) 的最短路径的话,显然答案就是 \(|x_A-x_B|+|y_A-y_B|\)(顺便说一句,这种距离的表示就是著名的曼哈顿距离)。

然后我们再考虑一下,\(F\) 在什么情况下会影响到原来的答案呢?

如果 \(A,B\) 即不在同一行也不在同一列,那么显然,\(F\) 是并不会影响上面的答案的,因为这样我们可以任意选择转弯的位置以避开 \(F\) 点而不影响最终的最短路径长度。

如果 \(A,B\) 在同一行,即 \(x_A=x_B\),设 \(y_{\min}=\min\{y_A,y_B\}\)\(y_{\max}=\max\{y_A,y_B\}\)。此时的 \(F\) 如果 \(x_F=x_A=x_B\)\(y_{\min}<y_F<y_{\max}\),那么我们需要绕过这个点,从而比原来的路径要多走 \(2\) 个单位的距离。否则 \(F\) 也不会影响最终的答案。

如果 \(A,B\) 在同一列,即 \(y_A=y_B\),设 \(x_{\min}=\min\{x_A,x_B\}\)\(x_{\max}=\max\{x_A,x_B\}\)。此时的 \(F\) 如果 \(y_F=y_A=y_B\)\(x_{\min}<x_F<x_{\max}\),那么我们需要绕过这个点,从而比原来的路径要多走 \(2\) 个单位的距离。否则 \(F\) 也不会影响最终的答案。

那么这道题目就做完了。

Code


int main() {
	MT {
		int xa = Rint, ya = Rint, xb = Rint, yb = Rint, xf = Rint, yf = Rint;
		if(xa == xb && xa == xf && yf >= min(ya, yb) && yf <= max(ya, yb)) println(abs(yb - ya) + 2);
		else if(ya == yb && ya == yf && xf >= min(xa, xb) && xf <= max(xa, xb)) println(abs(xb - xa) + 2);
		else println(abs(xb - xa) + abs(yb - ya));
	}
	return 0;
}
posted @ 2021-12-15 21:38  Eason_AC  阅读(51)  评论(0)    收藏  举报