789. 逃脱阻碍者
思路:这道题采用的是曼哈顿距离
出租车几何或曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。
在平面上,坐标(x1,y1)的i点与坐标(x2,y2)的j点的曼哈顿距离为:
d(i,j)=|X1-X2|+|Y1-Y2|.
采用各个点到终点的曼哈顿距离作为比较的方式,如果阻碍着能够提前到达终点,那么他就可以在终点等待,无论如何都无法成功离开。如果我们可以提前到达终点,那么无论阻碍者如何行走都无法在我们抵达终点之前抓住我们。
证明:反证法
假设存在一点,阻碍者能够提前我们到达,并且这一点是我们到达终点的必经点,那么在这点之后的任意一点,阻碍者都可以提前我们到达,包括终点,所以阻碍者必将提前我们到达终点。
数学方法:
假设目的地是 TT,初始时玩家位于 SS,阻碍者位于 GG,阻碍者在 XX 点拦截玩家。
由于阻碍者和目的地的曼哈顿距离大于玩家和目的地的曼哈顿距离,因此 dist(G,T)>dist(S,T)。
由于玩家会按照最短路径向目的地移动,因此如果阻碍者在 XX 点拦截玩家,则 XX 点一定在玩家前往目的地的最短路径上,满足dist(S,X)+dist(X,T)=dist(S,T)。
由于 XX 点是拦截点,因此阻碍者到达 XX 点的时间早于或等于玩家到达 XX 点的时间,即 dist(G,X)≤dist(S,X)。
因此有:
dist(G,X) ≤dist(S,X)
dist(G,X)+dist(X,T) ≤dist(S,X)+dist(X,T)
dist(G,X)+dist(X,T) ≤dist(S,T)
由于阻碍者到目的地的最短路径长度是 dist(G,T),因此有
dist(G,T)≤dist(G,X)+dist(X,T)≤dist(S,T)和条件dist(G,T)>dist(S,T) 矛盾。
因此当 dist(G,T)>dist(S,T) 时,阻碍者不可能在玩家前往目的地的中途拦截,玩家可以成功逃脱。
/**
* 789. 逃脱阻碍者
*/
public class Solution789 {
private int targetX = 0;
private int targetY = 0;
public boolean escapeGhosts(int[][] ghosts, int[] target) {
targetX = target[0];
targetY = target[1];
int myDistance = manhattanDistance(0, 0);
for (int[] spot : ghosts) {
if (manhattanDistance(spot[0], spot[1]) <= myDistance) {
return false;
}
}
return true;
}
// 曼哈顿距离
// | x1 - x2 | + | y1 - y2|
private int manhattanDistance(int x1, int y1) {
return Math.abs(x1 - targetX) + Math.abs(y1 - targetY);
}
}