用 C++ 逃避幽灵


假设我们正在玩一个简化的吃豆人游戏。现在我们从点 (0, 0) 开始,我们的目标是 (target[0], target[1])。地图上有几个幽灵,其中第 i 只幽灵从 (ghosts[i][0], ghosts[i][1]) 开始。在每一轮中,我们和所有幽灵同时(可能)向四个基本方向移动:北、东、西或南,从上一点移动到 1 个单位距离之外的新点。只在我们到达目标点,且在任何鬼到达我们之前(无论幽灵采取任何移动)的情况下,我们才能逃脱。如果我们和鬼同时到达任何方格(包括目标点),则不算逃脱。所以当有可能逃脱时,我们必须返回真。

所以,如果输入类似于 [[1,0], [0,3]],而目标是 [0,1],则结果将为真。这是因为我们可以直接在 1 时刻到达目标点 (0, 1),而位于 (1, 0) 或 (0, 3) 处的幽灵无法抓住我们。

为了解决这个问题,我们将按照以下步骤操作:

  • me := |target[1]| + |target[0]|
  • x := 0
  • 在 0 到鬼数组大小 - 1 的范围内对 i 循环
    • x := |ghosts[i,0] - target[0]| + |ghosts[i, 1] - target[1]|
    • 如果 x <= me,则返回假
  • 返回真

让我们看看下面的实现,以获得更好的理解 -

范例

 动态演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool escapeGhosts(vector<vector<int>>& ghosts, vector<int>& target) {
      int me = abs(target[1]) + abs(target[0]);
      int x = 0;
      for(int i = 0; i < ghosts.size(); i++){
         x = abs(ghosts[i][0] - target[0]) + abs(ghosts[i][1] - target[1]);
         if(x <= me) return false;
      }
      return true;
   }
};
main(){
   vector<vector<int>> v1 = {{1,0}, {0,3}};
   vector<int> v2 = {0,1};
   Solution ob;
   cout << (ob.escapeGhosts(v1, v2));
}

输入

[[1,0],[0,3]]
[0,1]

输出

1

更新于: 04-5-2020

274 次浏览

开启你的 职业生涯

完成教程,获得认证

开始吧
广告