[LeetCode] 789. Escape The Ghosts 逃離鬼魂


 

You are playing a simplified Pacman game. You start at the point (0, 0), and your destination is (target[0], target[1]). There are several ghosts on the map, the i-th ghost starts at (ghosts[i][0], ghosts[i][1]).

Each turn, you and all ghosts simultaneously *may* move in one of 4 cardinal directions: north, east, west, or south, going from the previous point to a new point 1 unit of distance away.

You escape if and only if you can reach the target before any ghost reaches you (for any given moves the ghosts may take.)  If you reach any square (including the target) at the same time as a ghost, it doesn't count as an escape.

Return True if and only if it is possible to escape.

Example 1:
Input: 
ghosts = [[1, 0], [0, 3]]
target = [0, 1]
Output: true
Explanation: 
You can directly reach the destination (0, 1) at time 1, while the ghosts located at (1, 0) or (0, 3) have no way to catch up with you.
Example 2:
Input: 
ghosts = [[1, 0]]
target = [2, 0]
Output: false
Explanation: 
You need to reach the destination (2, 0), but the ghost at (1, 0) lies between you and the destination.
Example 3:
Input: 
ghosts = [[2, 0]]
target = [1, 0]
Output: false
Explanation: 
The ghost can reach the target at the same time as you.

Note:

  • All points have coordinates with absolute value <= 10000.
  • The number of ghosts will not exceed 100.

 

這道題就是經典的吃豆人游戲啦,不過是簡化版,小人只能躲開鬼魂,並不能吃大力丸,反干鬼魂。小人在原點,有若干個鬼魂在不同的位置,給了一個目標點,問小人能不能安全到達目標點。這里的鬼魂的設定跟游戲中的一樣,都是很智能的,會朝着你移動,而且這里設定了如果跟鬼魂同時到達目標點也算輸。那么實際上這道題就是要求出小人到目標點的最短距離,注意這里的距離不是兩點之間的 Euclidean 距離,而應該是曼哈頓距離,即橫縱坐標分別求差的絕對值再相加。求出小人到目標點到最短距離后,還要求每個鬼魂到目標點的最短距離,如果有一個鬼魂到目標帶你的最短距離小於等於小人到目標點到最短距的話,那么就返回 false,否則返回 true,參見代碼如下:

 

解法一:

class Solution {
public:
    bool escapeGhosts(vector<vector<int>>& ghosts, vector<int>& target) {
        int dist = abs(target[0]) + abs(target[1]), mn = INT_MAX;
        for (auto ghost : ghosts) {
            int t = abs(ghost[0] - target[0]) + abs(ghost[1] - target[1]);
            mn = min(mn, t);
        }
        return dist < mn;
    }
};

 

我們可以對上面的解法進行一個小優化,就是其實並不需要算完每一個鬼魂到目標點到最短距離,而是每算一個就進行比較,只要小於等於小人到目標點的最短距離了,就直接返回 false。循環退出后返回 true,參見代碼如下:

 

解法二:

class Solution {
public:
    bool escapeGhosts(vector<vector<int>>& ghosts, vector<int>& target) {
        int dist = abs(target[0]) + abs(target[1]);
        for (auto ghost : ghosts) {
            int t = abs(ghost[0] - target[0]) + abs(ghost[1] - target[1]);
            if (t <= dist) return false;
        }
        return true;
    }
};

 

Github 同步地址:

https://github.com/grandyang/leetcode/issues/789

 

參考資料:

https://leetcode.com/problems/escape-the-ghosts/

https://leetcode.com/problems/escape-the-ghosts/discuss/116507/Java-5-liner

https://leetcode.com/problems/escape-the-ghosts/discuss/116522/C%2B%2BJavaPython-Easy-and-Concise-Solution

 

LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM