C++で無限のポイントの数を見つける
この問題では、2次元配列mat[n][m]が与えられます。私たちの仕事は、行列内の無限の点の数を見つけることです。
次の要素が1の場合、行列の任意の点は無限であると言われます。つまり、
mat[i][j] is endless when mat[i+1][j] … mat[n][j] and mat[i][j+1] … mat[i][m] are 1.
問題を理解するために例を見てみましょう
入力
mat[][] = {0, 0} {1, 1}
出力
2
説明
要素mat[0][1]とmat[1][1]は無限です。
ソリューションアプローチ
この問題の簡単な解決策は、行列のすべての要素を反復することです。そして、各要素について、現在の要素が無限であるかどうかを確認します。はいの場合、カウントを増やします。配列のすべての要素を確認した後、カウントを返します。
効率的なアプローチ
この問題を解決するために、動的計画法を使用して、要素が無限であるかどうかを確認します。 1である必要があった後、行と列のすべての要素が無限になるようにします。
したがって、2つのDP行列を使用して、各インデックスの無限の次の行と無限の次の列をカウントします。そして、位置に次の無限の行と列があるかどうか、各位置のチェック。次に、無限の要素の数を返します。
ソリューションの動作を説明するプログラム
例
#include <iostream> #include <math.h> using namespace std; const int monthDays[12] = { 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365 }; int countLeapYearDays(int d[]){ int years = d[2]; if (d[1] <= 2) years--; return ( (years / 4) - (years / 100) + (years / 400) ); } int countNoOfDays(int date1[], int date2[]){ long int dayCount1 = (date1[2] * 365); dayCount1 += monthDays[date1[1]]; dayCount1 += date1[0]; dayCount1 += countLeapYearDays(date1); long int dayCount2 = (date2[2] * 365); dayCount2 += monthDays[date2[1]]; dayCount2 += date2[0]; dayCount2 += countLeapYearDays(date2); return ( abs(dayCount1 - dayCount2) ); } int main(){ int date1[3] = {13, 3, 2021}; int date2[3] = {24, 5, 2023}; cout<<"The number of days between two dates is "<<countNoOfDays(date1, date2); return 0; }
出力
The number of days between two dates is 802
-
グラフ内のアーティキュレーションポイントの数を見つけるためのC++プログラム
グラフ内のアーティキュレーションポイント(またはカット頂点)は、グラフを削除する(およびグラフを通るエッジ)場合にグラフを切断するポイントです。切断された無向グラフのアーティキュレーションポイントは、接続されたコンポーネントの数を増やす頂点の削除です。 アルゴリズム Begin We use dfs here to find articulation point: In DFS, a vertex w is articulation point if one of the following two conditions is satisfi
-
C++のCHAR_BIT
CHAR_BITは、charのビット数です。これは、C++言語の「limits.h」ヘッダーファイルで宣言されています。 1バイトあたり8ビットです。 これがC++言語のCHAR_BITの例です 例 #include <bits/stdc++.h> using namespace std; int main() { int x = 28; int a = CHAR_BIT*sizeof(x); stack<bool> s; cout << "T