C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で幽霊を脱出


単純化されたパックマンゲームをプレイしているとします。ここで、ポイント(0、0)から開始し、宛先は(target [0]、target [1])です。マップ上にはいくつかのゴーストがあります。ここで、i番目のゴーストは(ghosts [i] [0]、ghosts [i] [1])から始まります。各ターンで、私たちとすべての幽霊は同時に(可能性があります)、北、東、西、または南の4つの基本的な方向のいずれかに移動し、最後のポイントから1単位離れた新しいポイントに移動します。ゴーストが私たちに到達する前にターゲットに到達できる場合にのみ、脱出できます(ゴーストが取る可能性のある特定の動きに対して)。ゴーストと同時に任意の正方形(ターゲットを含む)に到達した場合、それは到達しません。脱出として数えます。したがって、脱出できる場合はTrueを返す必要があります。

したがって、入力が[[1,0]、[0,3]]のようで、ターゲットが[0,1]の場合、結果はtrueになります。これは、時間1で目的地(0、1)に直接到達できるのに対し、(1、0)または(0、3)にいる幽霊は私たちを捕まえる方法がないためです。

これを解決するには、次の手順に従います-

  • me:=| target [1] | + | target [0] |
  • x:=0
  • 0からゴースト配列のサイズまでの範囲のiの場合– 1
    • x:=| ghosts [i、0] – target [0] | + | ghosts [i、1] –ターゲット[1] |
    • x <=meの場合、falseを返します
  • trueを返す

理解を深めるために、次の実装を見てみましょう-

#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

  1. C++の迷路

    空のスペースと壁のある迷路の中にボールがあるとします。これで、ボールは上、下、左、右などの任意の方向に転がることで空のパスを通過できますが、壁にぶつかるまで転がりが止まりません。ボールが止まると、次の方向を選択できます。 ボールの位置、目的地、迷路を開始し、ボールが目的地に止まるかどうかを確認する必要があります。迷路は1つの2D配列で表されます。ここで、1は壁を示し、0は空きスペースを示します。迷路の境界はすべて壁です。開始座標と宛先座標は、行と列のインデックスで表されます。 したがって、入力が2D配列で表される迷路のようなものである場合 0 0 1 0 0

  2. C++のMazeIII

    空のスペースと壁のある迷路があり、その迷路の中にボールもあるとします。ボールは、上(u)、下(d)、左(l)、または右(r)の方向に転がることで空きスペースを通過できますが、壁にぶつかるまで転がり続けます。ボールが止まると、次の方向を選ぶことができます。その迷路にも1つの穴があります。ボールが穴に転がると、ボールは穴に落ちます。 したがって、ボールの位置、穴の位置、迷路がある場合、最短距離を移動することでボールがどのように穴に落ちるかを調べる必要があります。ここで、距離は、ボールがスタート(除外)からホール(含まれる)まで移動した空きスペースの数によって定義されます。 「u」、「d」、「l