题目来源:https://leetcode-cn.com/problems/escape-the-ghosts/
大致题意:
玩家起始坐标为(0, 0),给定一个目标点,和几个阻碍点。
每次玩家和阻碍点可以向上下左右任意一个方向移动一个单位距离,也可选择保持不动。若在玩家到达目标点之前与阻碍点相遇,那么则判定玩家失败。问玩家是否可以移动到目标点。
思路
这道题说的花里胡哨的,但其实可以理解为最短路径问题。
曼哈顿距离
玩家若想成功,一定要尽快的移动到目标点,而若阻碍点可以在更短时间内移动到目标点,很明显玩家将一定会在到达目标点之前与阻碍点相遇。
曼哈顿距离:有点(x, y)和(a, b),则两点的曼哈顿距离为 dis = |x - a| + |y - b|
可以看出,玩家与目标点的曼哈顿距离即是需要移动的最短步数。于是
- 先求出起始点与目标点的曼哈顿距离
- 再求阻碍点与目标点的曼哈顿距离,若当前阻碍点的曼哈顿距离比起始点更短,那么直接返回false
- 若未返回false,返回true
代码:
class Solution {
public boolean escapeGhosts(int[][] ghosts, int[] target) {
int[] source = new int[]{0,0};
int sourceDis = manhattanDistance(source, target);
for (int[] ghost : ghosts) {
int distance = manhattanDistance(ghost, target);
if (distance <= sourceDis) {
return false;
}
}
return true;
}
public int manhattanDistance(int[] x, int[] y) {
return Math.abs(x[0]-y[0]) + Math.abs(x[1]-y[1]);
}
}