789. 逃脫阻礙者
你在進行一個簡化版的吃豆人游戲。你從 [0, 0] 點開始出發,你的目的地是 target = [xtarget, ytarget] 。地圖上有一些阻礙者,以數組 ghosts 給出,第 i 個阻礙者從 ghosts[i] = [xi, yi] 出發。所有輸入均為 整數坐標 。
每一回合,你和阻礙者們可以同時向東,西,南,北四個方向移動,每次可以移動到距離原位置 1 個單位 的新位置。當然,也可以選擇 不動 。所有動作 同時 發生。
如果你可以在任何阻礙者抓住你 之前 到達目的地(阻礙者可以采取任意行動方式),則被視為逃脫成功。如果你和阻礙者同時到達了一個位置(包括目的地)都不算是逃脫成功。
只有在你有可能成功逃脫時,輸出 true ;否則,輸出 false 。
示例 1:
輸入:ghosts = [[1,0],[0,3]], target = [0,1]
輸出:true
解釋:你可以直接一步到達目的地 (0,1) ,在 (1, 0) 或者 (0, 3) 位置的阻礙者都不可能抓住你。
示例 2:
輸入:ghosts = [[1,0]], target = [2,0]
輸出:false
解釋:你需要走到位于 (2, 0) 的目的地,但是在 (1, 0) 的阻礙者位于你和目的地之間。
示例 3:
輸入:ghosts = [[2,0]], target = [1,0]
輸出:false
解釋:阻礙者可以和你同時達到目的地。
示例 4:
輸入:ghosts = [[5,0],[-10,-2],[0,-5],[-2,-2],[-7,1]], target = [7,7]
輸出:false
示例 5:
輸入:ghosts = [[-1,0],[0,1],[-1,0],[0,1],[-1,0]], target = [0,0]
輸出:true
解題思路
曼哈頓距離——兩點在南北方向上的距離加上在東西方向上的距離,即d(i,j)=|xi-xj|+|yi-yj|
我們只需要計算阻礙者和終點的曼哈頓距離,以及起點和終點的曼哈頓距離,就可以判斷能否逃脫了。
因為曼哈頓距離是到達終點的最快路徑,如果阻礙者和終點的曼哈頓距離更小,他就可以在終點等我們,我們必死。
(假設我們阻礙者到終點的曼哈頓距離比我們大)從圖中可以看出,我們一直沿著最優路徑(曼哈頓距離)走的話,如果在某個點被攔截的話,那么說明后面阻礙者可以沿著我們的最優路徑一直走到終點,這意味著阻礙者的最優路徑長度是和我們一樣的,這與題意(阻礙者到終點的曼哈頓距離比我們大)相反,所以我們只需要判斷曼哈頓距離即可知道我們是否會被攔截
代碼
class Solution {public boolean escapeGhosts(int[][] ghosts, int[] target) {int tar = Math.abs(target[0])+ Math.abs(target[1]);for (int[] ghost : ghosts) {int gTar = Math.abs(target[0]-ghost[0])+ Math.abs(target[1]-ghost[1]);if (gTar<=tar)return false;}return true;}
}