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

最小数のパンチを見つけるためのC++プログラムは、ターゲットに到達する方法を作るために必要です


H行とW列を含む行列があるとします。セルは「。」を保持します。また '#'。ドット'。'通過可能なスペースを示し、「#」はブロックを示します。アマルは彼の家から市場に行きます。彼の家は左上隅の独房にあり、市場は右下隅にあります。 Amalは、1つのセルを上、下、左、または右に通過可能なセルに移動できます。彼は町を離れることができない。彼もブロックされたセルに入ることができません。しかし、彼の体力により、1回のパンチで2×2のセルを選択した正方形の領域のすべてのブロックを破壊し、これらのセルを通過させることができます。アマルが市場に参入するために必要な最小数のパンチを見つける必要があります。

したがって、入力が次のような場合

グリッドを-

のように作成できるため、出力は1になります。

マークされたボックスを破壊することによって

ステップ

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

n := row count of matrix
m := column count of matrix
Define one 2D array dist of order (n + 1) x (m + 1)
Define one deque dq
insert ( 0, 0 ) at the beginning of dq
dist[0, 0] := 0
while (not dq is empty), do:
   v := first element of dq
   delete front element from dq
   for initialize i := 0, when i < 4, update (increase i by 1), do:
      x := dx[i] + v[0]
      y := dy[i] + v[1]
      if x >= 0 and x < n and y >= 0 and y < m, then:
         if matrix[x, y] is same as '.', then:
            if dist[x, y] > dist[v[0], v[1]], then:
               dist[x, y] := dist[v[0], v[1]]
               insert pair { x, y } at the beginning of dq
         Otherwise
            for initialize p := x - 1, when p <= x + 1, update (increase p by 1), do:
               for initialize q := y - 1, when q <= y + 1, update (increase q by 1), do:
                  if p >= 0 and p < n and q >= 0 and q < m, then:
                     if dist[p, q] > dist[v[0], v[1]] + 1, then:
                        dist[p, q] := dist[v[0], v[1]] + 1
                        insert pair { p, q } at the end of dq
return dist[n - 1, m - 1]

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

#include <bits/stdc++.h>
using namespace std;

int dx[4] = { 0, 0, -1, 1 };
int dy[4] = { -1, 1, 0, 0 };

int solve(vector<vector<char>> matrix){
   int n = matrix.size();
   int m = matrix[0].size();
   vector<vector<int>> dist(n + 1, vector<int>(m + 1, 1e9));
   deque<array<int, 2>> dq;
   dq.push_front({ 0, 0 });
   dist[0][0] = 0;
   while (!dq.empty()){
      auto v = dq.front();
      dq.pop_front();
      for (int i = 0; i < 4; i++){
         int x = dx[i] + v[0], y = dy[i] + v[1];
         if (x >= 0 && x < n && y >= 0 && y < m){
            if (matrix[x][y] == '.'){
               if (dist[x][y] > dist[v[0]][v[1]]){
                  dist[x][y] = dist[v[0]][v[1]];
                  dq.push_front({ x, y });
               }
            } else{
               for (int p = x - 1; p <= x + 1; p++){
                  for (int q = y - 1; q <= y + 1; q++){
                     if (p >= 0 && p < n && q >= 0 && q < m){
                        if (dist[p][q] > dist[v[0]][v[1]] + 1){
                           dist[p][q] = dist[v[0]][v[1]] + 1;
                           dq.push_back({ p, q });
                        }
                     }
                  }
               }
            }
         }
      }
   }
   return dist[n - 1][m - 1];
}
int main(){
   vector<vector<char>> matrix = { { '.', '.', '#', '.', '.' }, { '#', '.', '#', '.', '#' }, { '#', '#', '.', '#', '#' }, { '#', '.', '#', '.', '#' }, { '.', '.', '#', '.', '.' } };
   cout << solve(matrix) << endl;
}

入力

{ { '.', '.', '#', '.', '.' }, { '#', '.', '#', '.', '#' },
{ '#', '#', '.', '#', '#' }, { '#', '.', '#', '.', '#' }, {
'.', '.', '#', '.', '.' } }

出力

1

  1. グラフを切断するためにカットするエッジの最小数を見つけるC++プログラム

    このプログラムでは、グラフのエッジ接続を見つける必要があります。グラフのグラフのエッジ接続は、それがブリッジであることを意味し、グラフを削除すると切断されます。接続されたコンポーネントの数は、切断された無向グラフのブリッジを削除すると増加します。 関数と擬似コード Begin    Function connections() is a recursive function to find out the connections:    A) Mark the current node un visited.    B) Initia

  2. Pythonで最終目標に到達するために必要なバスの最小数を見つけるためのプログラム

    各行に3つのフィールド[src、dest、id]が含まれるn x 3マトリックスがあるとします。これは、バスがsrcからdestへのルートを持っていることを意味します。新しいバスに乗るには1単位のお金がかかりますが、同じバスにとどまる場合は1単位だけ支払う必要があります。場所0から最終停留所(最大の場所)までバスに乗るのに必要な最小費用を見つける必要があります。解決策がない場合は-1を返します。 したがって、入力が次のような場合 0 1 0 1 2 0 2 3 0 3 5 1 5 0