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

C++でバイナリ行列のすべての要素を設定するために必要な最小限の操作


問題の説明

N行M列のバイナリ行列が与えられます。マトリックスで許可される操作は、任意のインデックス(x、y)を選択し、左上が(0、0)、右下が(x-1、y-1)の長方形の間ですべての要素を切り替えることです。要素を切り替えるとは、1を0に、0を1に変更することを意味します。タスクは、行列のすべての要素を設定する、つまりすべての要素を1にするために必要な最小限の操作を見つけることです。

If input matrix is {0, 0, 0, 1, 1}
   {0, 0, 0, 1, 1}
   {0, 0, 0, 1, 1}
   {1, 1, 1, 1, 1}
   {1, 1, 1, 1, 1}
Then answer is 1

1回の移動で、(3、3)を選択して、マトリックス全体が1のみで構成されるようにします。

アルゴリズム

アイデアは、終点(N – 1、M – 1)から開始し、逆の順序でマトリックスをトラバースすることです。値が0のセルに遭遇したときはいつでも、それを反転します

#include <iostream>
#define ROWS 5
#define COLS 5
using namespace std;
int getMinOperations(bool arr[ROWS][COLS]) {
   int ans = 0;
   for (int i = ROWS - 1; i >= 0; i--){
      for (int j = COLS - 1; j >= 0; j--){
         if(arr[i][j] == 0){
            ans++;
            for (int k = 0; k <= i; k++){
               for (int h = 0; h <= j; h++){
                  if (arr[k][h] == 1)
                     arr[k][h] = 0;
                  else
                     arr[k][h] = 1;
               }
            }
         }
      }
   }
   return ans;
}
int main() {
   bool mat[ROWS][COLS] = {
      0, 0, 1, 1, 1,
      0, 0, 0, 1, 1,
      0, 0, 0, 1, 1,
      1, 1, 1, 1, 1,
      1, 1, 1, 1, 1
   };
   cout << "Minimum required operations = " << getMinOperations(mat) << endl;
   return 0;
}

出力

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

Minimum required operations = 3

  1. C++でバイナリ行列をゼロ行列に変換するためのフリップの最小数

    mxnのバイナリ行列マットがあるとします。 1つのステップで、1つのセルを選択し、そのビットとその4つの隣接セルすべて(存在する場合)を反転できます。マットをゼロ行列に変換するために必要な最小ステップ数を見つける必要があります。解決策がない場合は、-1を返します。 したがって、指定された入力が[[0,0]、[0,1]]のような場合、変更は-のようになります。 したがって、3つのステップが必要で、出力は3になります。 これを解決するには、次の手順に従います- n:=行数、m:=列数、x:=0 iを初期化する場合:=0、i

  2. C++の2つの二分探索木のすべての要素

    2つのバイナリ検索ツリーがあり、これらのツリーにすべての要素が存在する値のリストを返す必要があり、リスト要素は昇順になります。したがって、木が次のような場合- その場合、出力は[0,1,1,2,3,4]になります。 これを解決するには、次の手順に従います- ansという配列を定義し、2つのスタックst1とst2を定義します curr1:=root1およびcurr2:=root2 ノードroot1とすべての左側のノードをst1に挿入し、ノードroot2とすべての左側のノードをst2に挿入します st1が空でないかst2が空でない場合 st1が空でない場合、および(st2が空で