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

C++での反転マトリックスの前日


バイナリ行列が1つあるとします。行を反転してから列を反転した場合に取得できる1の最大数を見つける必要があります。

つまり、入力が次のような場合

1 0 1
0 1 0
1 0 0

その場合、出力は8になります

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

  • n:=行列の行のサイズ

  • m:=行列の列のサイズ

  • ret:=0

  • サイズnの配列行を定義します

  • サイズnの配列列を定義します

  • 合計:=0

  • 初期化i:=0の場合、i

    • 初期化j:=0の場合、j

      • row [i]:=row [i] + matrix [i、j]

      • col [j]:=col [j] + matrix [i、j]

      • 合計:=合計+マトリックス[i、j]

  • 初期化i:=0の場合、i

    • 初期化j:=0の場合、j

      • cand:=total --row [i] --col [j] +((m --row [i])+(n --col [j]))

      • matrix [i、j]がゼロ以外の場合、-

        • cand:=cand + 2

      • それ以外の場合

        • cand:=cand-2

      • ret:=retとcandの最大値

  • retを返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(vector<vector<int>> &matrix) {
      int n = matrix.size();
      int m = matrix[0].size();
      int ret = 0;
      vector<int> row(n);
      vector<int> col(m);
      int total = 0;
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < m; j++) {
            row[i] += matrix[i][j];
            col[j] += matrix[i][j];
            total += matrix[i][j];
         }
      }
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < m; j++) {
            int cand = total - row[i] - col[j] + (m - row[i]) + (n -
            col[j]);
            if (matrix[i][j]) {
               cand += 2;
            }else {
               cand -= 2;
            }
            ret = max(ret, cand);
         }
      }
      return ret;
   }
};
main() {
   Solution ob;
   vector<vector<int>> v = {{1,0,1},{0,1,0},{1,0,0}};
   cout << (ob.solve(v));
}

入力

{{1,0,1},{0,1,0},{1,0,0}}

出力

8

  1. C++での行列の行方向と列方向のトラバーサル

    マトリックスは2つの方法でトラバースできます。行マイズトラバーサルは、最初の行から2番目、というように最後の行まで、各行を1つずつ訪問します。行の要素は、インデックス0から最後のインデックスまで返されます。 列ごとのトラバーサルでは、要素は最初の列から最後の列に順番にトラバースされます。 2DマトリックスではM[i][j]。インデックスiは行を表すために使用され、インデックスjは列を表すために使用されます。行ごとのトラバーサルの場合は、から開始します。 i=0行目および0<=j<最後のインデックス i=1行目および0<=j<最後のインデックス ..... i=最後の行と0<=j<

  2. C++のスパイラルマトリックスIII

    R行とC列の2次元グリッドがあるとすると、東向きの(r0、c0)から開始します。ここで、グリッドの北西の角は最初の行と列にあり、グリッドの南東の角は最後の行と列にあります。このグリッドのすべての位置を訪問するために、時計回りのスパイラル形状で歩きます。グリッドの境界の外側にいるときは、グリッドの外側を歩き続けます(ただし、後でグリッドの境界に戻る場合があります)。グリッドの位置を表す座標のリストを、訪問した順序で見つける必要があります。したがって、グリッドが-のような場合 次に、矢印がパスになります。 これを解決するには、次の手順に従います- dirrを作成:=[[0,1]、[