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

グリッド内の偶数のセルの数を最大化するための操作の数を見つけるためのC++プログラム


次元h*wのグリッドが与えられていると仮定します。グリッド内のすべてのセルには、特定の値が割り当てられています。偶数の値を持つセルを最大化する必要があります。これを行うには、以前に選択されていないセルを選択してから、現在のセルの値を1つ減らし、現在のセルに垂直または水平に隣接する別のセルの値を1つ増やします。操作数と増減操作のセル数を出力します。出力は以下の形式になります-

  • 操作の数

  • 1番目(セル位置の減少)-(セル位置の増加)

    ....

  • n番目(セル位置の減少)-(セル位置の増加)

したがって、入力がh =3、w =3、grid ={{2、3、4}、{2、0、1}、{1、2、3}}の場合、出力は

4
(0, 1) - (0, 2)
(2, 0) - (2, 1)
(2, 1) - (2, 2)
(0, 2) - (1, 2)

ステップ

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

Define a new array result that contains a tuple
for initialize i := 0, when i < h, update (increase i by 1), do:
   tp := 0
   for initialize j := 0, when j < w, update (increase j by 1), do:
      if tp > 0, then:
         insert tuple(i, j - 1, i, j) at the end of result
         grid[i, j] := grid[i, j] + tp
      if grid[i, j] mod 2 is same as 1 and j < w-1, then:
         grid[i, j] := grid[i, j] - 1
         tp := 1
      Otherwise
         tp := 0
tp := 0
for initialize i := 0, when i < h, update (increase i by 1), do:
   if tp > 0, then:
  insert tuple(i - 1, w - 1, i, w - 1) at the end of result
grid[i, w - 1] := grid[i, w - 1] + tp
if grid[i, w - 1] mod 2 is same as 1, then:
grid[i, w - 1] := grid[i, w - 1] - 1
tp := 1
Otherwise
tp := 0
print(size of result)
for initialize i := 0, when i < size of result, update (increase i by 1), do:
print('(' + first value of result[i] + ',' + second value of result[i] + '- (' + third value of result[i] + ',' + fourth value of result[i])

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

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

void solve(int h, int w, vector<vector<int>>grid){
   vector<tuple<int,int,int,int>> result;
   for(int i = 0; i < h; i++){
      int tp = 0;
      for(int j = 0; j < w; j++){
         if(tp > 0){
            result.push_back(make_tuple(i, j-1, i, j));
            grid[i][j] += tp;
         }
         if(grid[i][j]%2 == 1 && j < w-1){
            grid[i][j] -= 1;
            tp = 1;
         }
         else
            tp = 0;
      }
   }
   int tp = 0;
   for(int i = 0; i < h; i++){
      if(tp > 0){
         result.push_back(make_tuple(i-1, w-1, i, w-1));
         grid[i][w-1] += tp;
      }
      if(grid[i][w-1]%2 == 1){
         grid[i][w-1] -= 1;
         tp = 1;
      }
      else
         tp = 0;
   }
   cout << (int)result.size() << endl;
   for(int i = 0; i < (int)result.size(); i++){
      cout << "(" << get<0>(result[i]) << ", " << get<1>(result[i])
      << ")" << " - (" << get<2>(result[i]) << ", " << get<3>(result[i]) << ")";
      cout << '\n';
   }
}
int main() {
   int h = 3, w = 3 ;
   vector<vector<int>> grid = {{2, 3, 4}, {2, 0, 1}, {1, 2, 3}};
   solve(h, w, grid);
   return 0;
}

入力

3, 3, {{2, 3, 4}, {2, 0, 1}, {1, 2, 3}}

出力

4
(0, 1) - (0, 2)
(2, 0) - (2, 1)
(2, 1) - (2, 2)
(0, 2) - (1, 2)

  1. グリッド内の照らされたセルの数を見つけるためのC++プログラム

    次元h*wのグリッドが与えられていると仮定します。グリッド内のセルには、球根または障害物のいずれかを含めることができます。電球のセルはそれ自体とその右、左、上、下のセルを照らし、障害物のセルが光を遮らない限り、光はセルを通して輝くことができます。障害物セルは照明できず、電球セルからの光が他のセルに到達するのを防ぎます。したがって、配列「bulb」内のグリッド内の電球セルの位置と配列「obstacles」内の障害物セルの位置を考えると、照らされているグリッド内のセルの総数を見つける必要があります。 したがって、入力がh =4、w =4、bulb ={{1、1}、{2、2}、{3、3}}、障害物

  2. パスを作成するためにグリッドでブロックするセルの数を見つけるためのC++プログラム

    次元h*wのグリッドがあるとします。セル位置(0、0)にロボットがあり、その位置(h-1、w-1)に移動する必要があります。グリッドには、ブロックされたセルとブロックされていないセルの2種類のセルがあります。ロボットはブロックされていないセルを通過できますが、ブロックされたセルを通過することはできません。ロボットは4つの方向に進むことができます。左、右、上、下に移動できます。ただし、ロボットはセルから別のセルに任意の方向に移動する可能性があるため(前のセルを無視して)、1つのパスのみを作成し、そのパスにない他のすべてのセルをブロックする必要があります。 (0、0)から(h -1、w -1)まで