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

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) の計算方法が非常に有効です。

  1. サイズ d の正十二角形を作れる組み合わせの数を求める C++ プログラム

    問題概要 整数 d が与えられたとします。ここで、一辺の長さが 1 の正方形タイルと正三角形タイルが無限枚あるものと考えます。これらのタイルを組み合わせて、一辺の長さが d の正十二角形(12 辺形)を作るとき、その作り方が何通りあるかを求めるのがこの問題です。答えが非常に大きくなる場合は、998244353 で割った余りを返します。 アプローチ この問題は、二項係数を利用することで効率的に解くことができます。結論から言うと、求めるべき答えは C(2d−1, d−1)、すなわち「2d−1 個の中から d−1 個を選ぶ組み合わせの総数」です。 階乗を直接計算すると値が急激に大きくなりオーバー

  2. 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 列目