C++でmatrix(i, j) = i+jとなるn×n行列内のkの出現回数をカウントする方法
整数値で構成される行列が与えられ、その中に特定の整数 k が何回出現するかをカウントすることが課題です。行列のサイズは任意に設定できますが、本記事では 4×4 の行列を例に解説します。行列は matrix(i, j) = i + j という条件に基づいて生成され、インデックスは 0 から始まるため、matrix[0][0] = 0 となります。
入出力例
例1
入力: int size = 4, k = 4
出力: 4×4 の行列における 4 の出現回数は 3
説明:
matrix[i][j] = i + j(i = j = 4)
Matrix[4][4] = {
0, 1, 2, 3
1, 2, 3, 4
2, 3, 4, 5
3, 4, 5, 6
}
数値 k(= 4)はこの行列の中に 3 回出現します。
例2
入力: int size = 3, k = 1
出力: 3×3 の行列における 1 の出現回数は 2
説明:
matrix[i][j] = i + j(i = j = 3)
Matrix[3][3] = {
0, 1, 2
1, 2, 3
2, 3, 4
}
数値 k(= 1)はこの行列の中に 2 回出現します。
アルゴリズムの考え方
- n × n 行列のサイズと、探索対象となる整数値 k を入力として受け取る
- 外側のループ変数 i を 0 から行サイズまで繰り返す
- 内側のループ変数 j を 0 から列サイズまで繰り返す
- 各要素に matrix[i][j] = i + j を代入する
- matrix[i][j] が k と等しいかどうかを判定する
- 一致していればカウントを 1 増やし、一致しなければそのまま次の要素へ進む
- すべての走査が終わったらカウントを返す
- 結果を出力する
C++ 実装例
#include <iostream>
using namespace std;
int countOccurrences(int size, int k){
int count = 0;
int matrix[size][size];
for(int i = 0; i < size; i++){
for(int j = 0; j < size; j++){
matrix[i][j] = i + j;
if(matrix[i][j] == k){
count++;
}
}
}
return count;
}
int main(){
int size = 4;
int k = 4;
int total = countOccurrences(size, k);
if(total > 0){
cout << "Count of frequency of " << k << " in a matrix of size "
<< size << "X" << size << " where matrix(i, j) = i+j is: " << total;
} else {
cout << "Frequency of element is 0 that means it is not present in a matrix";
}
}
出力結果
上記のコードを実行すると、次のような出力が得られます。
Count of frequency of 4 in a matrix of size 4X4 where matrix(i, j) = i+j is: 3
補足: 計算量と数学的なアプローチ
この方法の時間計算量・空間計算量はどちらも O(n²) です。しかし、この行列には規則性があるため、行列を実際に生成せずに数学的に答えを求めることも可能です。値 k が出現するセルは i + j = k を満たす反対角線上に並んでおり、その出現回数は次の式で表されます。
count(k) = min(k + 1, 2n − 1 − k) ※ 0 ≤ k ≤ 2n − 2 の場合 それ以外の場合は 0
例えば n = 4、k = 4 の場合、min(5, 3) = 3 となり、実際のカウント結果と一致します。大規模な行列を扱う場合には、この数式による O(1) の計算方法が非常に有効です。
-
サイズ d の正十二角形を作れる組み合わせの数を求める C++ プログラム
問題概要 整数 d が与えられたとします。ここで、一辺の長さが 1 の正方形タイルと正三角形タイルが無限枚あるものと考えます。これらのタイルを組み合わせて、一辺の長さが d の正十二角形(12 辺形)を作るとき、その作り方が何通りあるかを求めるのがこの問題です。答えが非常に大きくなる場合は、998244353 で割った余りを返します。 アプローチ この問題は、二項係数を利用することで効率的に解くことができます。結論から言うと、求めるべき答えは C(2d−1, d−1)、すなわち「2d−1 個の中から d−1 個を選ぶ組み合わせの総数」です。 階乗を直接計算すると値が急激に大きくなりオーバー
-
C++でブール行列を処理する方法:1の要素がある行と列をすべて1にするアルゴリズム
ブール行列とはブール行列(Boolean Matrix)とは、要素が「0」と「1」の2種類のみで構成される行列のことです。この問題では、m×n のサイズのブール行列 arr[m][n] が与えられます。求解条件は次のとおりです。条件: もし m[i][j] = 1 であるなら、i 行目のすべての要素と j 列目のすべての要素を 1 にする。具体例入力と出力の例を見てみましょう。入力: arr[2][2] =1 00 0出力: arr[2][2] =1 11 0説明: arr[0][0] = 1 であるため、0 行目のすべての要素(arr[0][0] = arr[0][1] = 1)と、0 列目