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で
- for j:=0からm– 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
-
C++のスパイラルマトリックスIII
R行とC列の2次元グリッドがあるとすると、東向きの(r0、c0)から開始します。ここで、グリッドの北西の角は最初の行と列にあり、グリッドの南東の角は最後の行と列にあります。このグリッドのすべての位置を訪問するために、時計回りのスパイラル形状で歩きます。グリッドの境界の外側にいるときは、グリッドの外側を歩き続けます(ただし、後でグリッドの境界に戻る場合があります)。グリッドの位置を表す座標のリストを、訪問した順序で見つける必要があります。したがって、グリッドが-のような場合 次に、矢印がパスになります。 これを解決するには、次の手順に従います- dirrを作成:=[[0,1]、[
-
マトリックスがC++で反転可能かどうかを確認します
ここでは、行列が可逆であるかどうかを確認する方法を説明します。 1つの行列がMの場合、逆行列M-1は-になります。 $$ M ^ -1 =\ frac {adj(M)} {| M \ lvert} $$ したがって、Mの行列式がゼロ以外の場合は、逆数を取得できるのは私たちだけです。そうでない場合は、逆数を取得できません。したがって、ここでは、行列式がゼロ以外であるかどうかを確認する必要があります。行列式を見つけることは、再帰的なプロセスの1つです。部分行列を見つけ、その行列式を見つけ、その結果を最終的な計算に使用する必要があります。より良いアイデアを得るためにコードを見てみましょう。 例