C++ですべてのものを含む正方形の部分行列を数える
サイズがmxnのバイナリ行列を想定します。すべて1で、正方形の部分行列の数を数える必要があります。したがって、行列が-
のような場合0 | 1 | 1 | 1 |
---|---|---|---|
1 | 1 | 1 | 1 |
0 | 1 | 1 | 1 |
したがって、15個の正方形があります。単一のものの10の正方形、4つのものの4つの正方形、および9つのものの1つの正方形。
これを解決するには、次の手順に従います-
- set ans:=0、n:=行数およびm:=列数
- 0からm–1の範囲のiの場合
- ans:=ans + matrix [n – 1、i]
- 0からn–1の範囲のiの場合
- ans:=ans + matrix [i、m – 1]
- ans:=ans – matrix [n – 1、m-1]
- n –2から0までの範囲のiの場合
- m –2から0までの範囲のjの場合
- matrix [i、j] =1の場合、
- matrix [i、j]:=1 +最小値(matrix [i + 1、j + 1]、matrix [i、j + 1]、matrix [i + 1、j])
- それ以外の場合、matrix [i、j]:=0
- ans:=ans + matrix [i、j]
- matrix [i、j] =1の場合、
- m –2から0までの範囲のjの場合
- 回答を返す
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; class Solution { public: int countSquares(vector<vector<int>>& matrix) { int ans = 0; int n = matrix.size(); int m = matrix[0].size(); for(int i = 0; i < m; i++)ans += matrix[n-1][i]; for(int i = 0; i < n; i++)ans += matrix[i][m-1]; ans -= matrix[n-1][m-1]; for(int i = n - 2;i >= 0; i--){ for(int j = m-2 ;j >= 0; j--){ matrix[i][j] = matrix[i][j] == 1? 1 + min({matrix[i+1][j+1],matrix[i] [j+1],matrix[i+1][j]}) : 0; ans += matrix[i][j]; } } return ans; } }; main(){ vector<vector<int>> v = {{0,1,1,1},{1,1,1,1},{0,1,1,1}}; Solution ob; cout << (ob.countSquares(v)); }
入力
[[0,1,1,1], [1,1,1,1], [0,1,1,1]]
出力
15
-
C ++でA%X=BとなるようなXのすべての可能な値のカウント
2つの整数AとB、および数値Xが与えられます。目標は、A%X=BとなるようにXが持つことができる値の数を見つけることです。上記の式の場合、A ==Bの場合、Xの無限の値が可能であるため、-1を返します。 A Bの場合、結果として(AB)の約数の数を返します。 例 入力 A=5, B=2 出力 Count of all possible values of X such that A % X = B are: 1 説明 5%3=2. So X is 3 here. 入力 A=10, B=10 出力 Count of all possible values of X such that A
-
C++でmが同一線上にある合計nポイントの三角形の数
2D平面上の点の数を表す2つの変数nとmが与えられます。 n個のポイントのうち、m個のポイントは同一線上にあります。目標は、これらのn個の点を使用して形成できる三角形の数を見つけることです。 同一線上の点 −同じ線上にある点は同一線上にあると呼ばれます。ポイントAとBは同一線上にあります。 n =4(A、B、C、D)の場合、m =2(A、B) 三角形の数- 4から任意の3つのポイントを選択=4C 3 ただし、同一線上の点は三角形を形成できないため、上記でカウントされる可能性のある三角形を削除します=2C 3 三角形の合計=4C 3 --2C 3 =4-0 =4