[LeetCode] 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[]) + abs(target[]), mn = INT_MAX;
        for (auto ghost : ghosts) {
            int t = abs(ghost[] - target[]) + abs(ghost[] - target[]);
            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[]) + abs(target[]);
        for (auto ghost : ghosts) {
            int t = abs(ghost[] - target[]) + abs(ghost[] - target[]);
            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
LeetCode All in One 题目讲解汇总(持续更新中...)
[LeetCode] Escape The Ghosts 逃离鬼魂的更多相关文章
- [LeetCode] 789. Escape The Ghosts 逃离鬼魂
		
You are playing a simplified Pacman game. You start at the point (0, 0), and your destination is (ta ...
 - LC 789. Escape The Ghosts
		
You are playing a simplified Pacman game. You start at the point (0, 0), and your destination is(tar ...
 - 【LeetCode】789. Escape The Ghosts 解题报告(Python & C++)
		
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...
 - LeetCode 789. Escape The Ghosts
		
题目链接:https://leetcode.com/problems/escape-the-ghosts/description/ You are playing a simplified Pacma ...
 - 73th LeetCode Weekly Contest Escape The Ghosts
		
You are playing a simplified Pacman game. You start at the point (0, 0), and your destination is(tar ...
 - [Swift]LeetCode789. 逃脱阻碍者 | Escape The Ghosts
		
You are playing a simplified Pacman game. You start at the point (0, 0), and your destination is (ta ...
 - 789. Escape The Ghosts
		
You are playing a simplified Pacman game. You start at the point (0, 0), and your destination is (ta ...
 - 【Leetcode周赛】从contest-71开始。(一般是10个contest写一篇文章)
		
Contest 71 () Contest 72 () Contest 73 (2019年1月30日模拟) 链接:https://leetcode.com/contest/weekly-contest ...
 - Swift LeetCode 目录 | Catalog
		
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
 
随机推荐
- SpringBoot系列: CommandLineRunner接口的用处
			
========================================使用 CommandLineRunner 对Spring Bean进行额外初始化==================== ...
 - [物理学与PDEs]第4章第1节 引言
			
1. 本章讨论可燃流体在流动过程中同时伴随着燃烧现象的情况. 2. 燃烧有两种, 一种是爆燃 (deflagration): 火焰低速向前传播, 此时流体微元通常是未燃气体.已燃气体的混合物; 一 ...
 - [物理学与PDEs]第2章习题9 粘性流体动能的衰减
			
设 $\Omega\subset {\bf R}^3$ 为有界域, ${\bf u}$ 为 Navier-Stokes 方程组 (3. 4)-(3. 5) 满足边界条件 (3. 7) 的解, 其中体积 ...
 - QMainWindow-状态栏
			
self.status_bar = self.statusBar() # 显示状态栏 self.setStatusTip('这是一个窗口') #鼠标在指定控件上时,状态栏 ...
 - 子级用了float浮动之后,如何撑开父元素,让父元素div自动适应高度
			
方法一:对父级设置固定高度 假如以上案例,我们知道内部div高度100px,那对父级设置css height为100px看看效果. 此方法缺点,父级是固定高度,而不随内容高度自适应高度,没高度.此方法 ...
 - 移动端控制视频点击播放点击下一个视频时自动停止播放&监听滑动溢出屏幕高度时停止播放
			
直接上代码js部分: <script type="text/javascript"> var go;//记录video播放器位置 var video=document. ...
 - 在window系统上安装redis服务-Invalid argument during startup: Failed to open the .conf
			
当前redis版本: redis-cli -v redis-cli 3.0.503 网上给的命令(在redis所在文件夹下执行): redis-server –service-install redi ...
 - Ubuntu18.04 VMtools的安装与卸载
			
VM不推荐在Ubuntu中使用VMtools而是open-vm-tools,原文地址https://kb.vmware.com/s/article/2073803 安装方式 1 更新系统源 sudo ...
 - VS2012遇到一个问题:"链接器工具错误 LNK2026 XXX模块对于 SAFESEH 映像是不安全的"
			
解决方法: 1.打开该项目的“属性页”对话框. 2.单击“链接器”文件夹. 3.单击“命令行”属性页. 4.将 /SAFESEH:NO 键入“附加选项”框中,然后点击应用.
 - oracle查看执行最慢与查询次数最多的sql语句
			
前言 在ORACLE数据库应用调优中,一个SQL的执行次数/频率也是常常需要关注的,因为某个SQL执行太频繁,要么是由于应用设计有缺陷,需要在业务逻辑上做出优化处理,要么是业务特殊性所导致.如果执行频 ...