ホームページ >バックエンド開発 >C++ >ロボットがグリッド内の特定のセルに到達するために必要なジャンプの回数を見つけるための C++ プログラム

ロボットがグリッド内の特定のセルに到達するために必要なジャンプの回数を見つけるための C++ プログラム

WBOY
WBOY転載
2023-09-17 19:17:02610ブラウズ

ロボットがグリッド内の特定のセルに到達するために必要なジャンプの回数を見つけるための C++ プログラム

h x w のグリッドがあるとします。グリッドは「initGrid」と呼ばれる 2 次元配列で表され、グリッド内の各セルは「#」または「.」で表されます。 「#」はグリッド内に障害物があることを意味し、「.」はそのセル上にパスがあることを意味します。ここで、ロボットがグリッド上の行番号 x と列番号 y のセル「c」に配置されます。ロボットは行番号 p、列番号 q のセル「d」から別のセルに移動する必要があります。セル座標 c と d は両方とも整数のペアとして指定されます。これで、ロボットは次のようにセル間を移動できるようになります:

  • ロボットが移動したいセルが現在のセルに垂直または水平に隣接して配置されている場合、ロボットはあるセルから別のセルまで直接歩くことができます。

  • ロボットは、現在の位置を中心とする 5x5 のエリア内の任意のセルにジャンプできます。

  • ロボットは、障害物を含まないグリッド内の別のセルにのみ移動できます。ロボットもグリッドから離れることはできません。

ロボットがターゲットに到達するのに必要なホップ数を調べる必要があります。

つまり、入力が h = 4、w = 4、c = {2, 1}、d = {4, 4}、initGrid = {"#...", ".##.", " ...#", "..#."} の場合、出力は 1 になります。ロボットは目的地に到達するために 1 回のジャンプだけで済みます。

この問題を解決するには、次の手順に従います。

N:= 100
Define intger pairs s and t.
Define an array grid of size: N.
Define an array dst of size: N x N.
Define a struct node that contains integer values a, b, and e.
Define a function check(), this will take a, b,
   return a >= 0 AND a < h AND b >= 0 AND b < w
Define a function bfs(), this will take a, b,
   for initialize i := 0, when i < h, update (increase i by 1), do:
   for initialize j := 0, when j < w, update (increase j by 1), do:
      dst[i, j] := infinity
   dst[a, b] := 0
   Define one deque doubleq
   Insert a node containing values {a, b, and dst[a, b]} at the end of doubleq
   while (not doubleq is empty), do:
      nd := first element of doubleq
      if e value of nd > dst[a value of nd, b value of nd], then:
         Ignore the following part, skip to the next iteration
   for initialize diffx := -2, when diffx <= 2, update (increase diffx by 1), do:
   for initialize diffy := -2, when diffy <= 2, update (increase diffy by 1), do:
      tm := |diffx + |diffy||
      nx := a value of nd + diffx, ny = b value of nd + diffy
      if check(nx, ny) and grid[nx, ny] is same as &#39;.&#39;, then:
         w := (if tm > 1, then 1, otherwise 0)
         if dst[a value of nd, b value of nd] + w < dst[nx, ny], then:
            dst[nx, ny] := dst[a value of nd, b value of nd] + w
            if w is same as 0, then:
               insert node containing values ({nx, ny, dst[nx, ny]}) at the beginning of doubleq.
          Otherwise
insert node containing values ({nx, ny, dst[nx, ny]}) at the end of doubleq.
s := c
t := d
(decrease first value of s by 1)
(decrease second value of s by 1)
(decrease first value of t by 1)
(decrease second value of t by 1)
for initialize i := 0, when i < h, update (increase i by 1), do:
grid[i] := initGrid[i]
bfs(first value of s, second value of s)
print(if dst[first value of t, second value of t] is same as infinity, then -1, otherwise dst[first value of t, second value of t])

Example

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

#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
#define N 100
int h, w;
pair<int, int> s, t;
string grid[N];
int dst[N][N];
struct node {
   int a, b, e;
};
bool check(int a, int b) {
   return a >= 0 && a < h && b >= 0 && b < w;
}
void bfs(int a, int b) {
   for (int i = 0; i < h; i++) {
      for (int j = 0; j < w; j++)
         dst[i][j] = INF;
   }
   dst[a][b] = 0;
   deque<node> doubleq;
   doubleq.push_back({a, b, dst[a][b]});

   while (!doubleq.empty()) {
      node nd = doubleq.front();
      doubleq.pop_front();
      if (nd.e > dst[nd.a][nd.b])
         continue;
      for (int diffx = -2; diffx <= 2; diffx++) {
         for (int diffy = -2; diffy <= 2; diffy++) {
            int tm = abs(diffx) + abs(diffy);
            int nx = nd.a + diffx, ny = nd.b + diffy;
            if (check(nx, ny) && grid[nx][ny] == &#39;.&#39;) {
               int w = (tm > 1) ? 1 : 0;
               if (dst[nd.a][nd.b] + w < dst[nx][ny]) {
                  dst[nx][ny] = dst[nd.a][nd.b] + w;
                  if (w == 0)
                     doubleq.push_front({nx, ny, dst[nx][ny]});
                  else
                     doubleq.push_back({nx, ny, dst[nx][ny]});
               }
            }
         }
      }
   }
}
void solve(pair<int,int> c, pair<int, int> d, string initGrid[]){
   s = c;
   t = d;
   s.first--, s.second--, t.first--, t.second--;
   for(int i = 0; i < h; i++)
      grid[i] = initGrid[i];
   bfs(s.first, s.second);
   cout << (dst[t.first][t.second] == INF ? -1 :
      dst[t.first][t.second]) << &#39;\n&#39;;
}
int main() {
   h = 4, w = 4;
   pair<int,int> c = {2, 1}, d = {4, 4};
   string initGrid[] = {"#...", ".##.", "...#", "..#."};
   solve(c, d, initGrid);
   return 0;
}

Input

4, 4, {2, 1}, {4, 4}, {"#...", ".##.", "...#", "..#."}

出力

1

以上がロボットがグリッド内の特定のセルに到達するために必要なジャンプの回数を見つけるための C++ プログラムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はtutorialspoint.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。