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

C++の行列に奇数値を持つセル


行列の次元であるnとmがあるとします。これらはゼロで初期化されます。そして、インデックスは、indexes [i] =[ri、ci]で与えられます。 [ri、ci]の各ペアについて、行riと列ciのすべてのセルを1ずつインクリメントする必要があります。出力は、すべてのインデックスに増分を適用した後、マトリックス内の奇数値を持つセルの数になります。

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

  • 奇数:=0、およびx:=行列の行数を初期化します
  • マトリックスマットを作成する
  • 0からxの範囲のiの場合
    • r =input [i、0]、c =input [i、1]、
    • 0からm–1の範囲のjの場合
      • mat [r、j]:=mat [r、j] + 1
    • 0からn–1の範囲のjの場合
      • mat [j、c]:=mat [j、c] + 1
  • 0からn–1の範囲のiの場合
    • for j:=0からm– 1
      • odd:=odd + mat [i、j]ビット単位または1で
  • 奇数を返す

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
      int oddCells(int n, int m, vector<vector<int>>& in) {
      int odd = 0;
      int x = in.size();
      vector < vector <int> > mat(n, vector <int>(m));
      for(int i = 0; i < x ;i++){
         int r = in[i][0];
         int c = in[i][1];
         for(int j = 0; j < m; j++){
            mat[r][j]++;
         }
         for(int j = 0; j < n; j++){
            mat[j][c]++;
         }
      }
      for(int i = 0; i < n; i++){
         for(int j = 0; j < m; j++)odd += mat[i][j] & 1;
      }
      return odd;
   }
};
main(){
   Solution ob;
   vector<vector<int>> c = {{0,1},{1,1}};
   cout << ob.oddCells(2,3,c);
}

入力

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

出力

6

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

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

  2. マトリックスがC++で反転可能かどうかを確認します

    ここでは、行列が可逆であるかどうかを確認する方法を説明します。 1つの行列がMの場合、逆行列M-1は-になります。 $$ M ^ -1 =\ frac {adj(M)} {| M \ lvert} $$ したがって、Mの行列式がゼロ以外の場合は、逆数を取得できるのは私たちだけです。そうでない場合は、逆数を取得できません。したがって、ここでは、行列式がゼロ以外であるかどうかを確認する必要があります。行列式を見つけることは、再帰的なプロセスの1つです。部分行列を見つけ、その行列式を見つけ、その結果を最終的な計算に使用する必要があります。より良いアイデアを得るためにコードを見てみましょう。 例