LC789-逃脱阻碍者

789. 逃脱阻碍者

关键:算曼哈顿距离来判断

解析:简化一下 让所有的鬼都去终点等着人,如果鬼先到终点就不行,人先到终点就可。

可以证明出:如果一个阻碍者能够抓到玩家,必然不会比玩家更晚到达终点

为了方便,我们设玩家起点阻碍者起点终点分别为 \(s\)、\(e\) 和 \(t\),计算两点距离的函数为 \(dist(x, y)\)。

假设玩家从 \(s\) 到 \(t\) 的路径中会经过点 \(k\),当且仅当 \(dist(e, k) <= dist(s, k)\),即阻碍者起点与点 \(k\) 的距离小于等于玩家起点与点 \(k\) 的距离时,阻碍者可以在点 \(k\) 抓到玩家。

由于玩家到终点以及阻碍者到终点的路径存在公共部分 \(dist(k, t)\),可推导出:

\(dist(e, k) + dist(k, t) <= dist(s, k) + dist(k, t)\)

即得证 如果一个阻碍者能够抓到玩家,那么该阻碍者必然不会比玩家更晚到达终点。

由于步长为 1,且移动规则为上下左右四联通方向,因此 \(dist(x, y)\)的实现为计算两点的曼哈顿距离

class Solution {
public:
    bool escapeGhosts(vector<vector<int>>& ghosts, vector<int>& target) {
        int tar = abs(target[0]) + abs(target[1]);
        for(auto& e : ghosts)
            if(abs(e[0] - target[0]) + abs(e[1] - target[1]) <= tar)return false;
        return true;
    }
};
上一篇:js轮播时的动画效果函数封装


下一篇:LG 题解 P7841 「PMOI-4」生成树