LeetCode--789. 逃脱阻碍者

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);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值