C++で特別な行列内のxと等しい要素の個数をカウントする方法
正方行列 mat[][] が与えられ、その各要素は mat[i][j] = i*j として定義されているとします。このとき、行列内に存在する「x と等しい要素」の個数を求めることが本記事の課題です。
行列とは、数値や要素を行(row)と列(column)の形式で表現する2次元配列のようなものです。画像処理やグラフ理論など、さまざまな分野で活用される基本的なデータ構造です。
それでは、具体例を使いながらこの問題の解き方を確認していきましょう。
入力例1
matrix[row][col] = {
{1, 2, 3},
{3, 4, 3},
{3, 4, 5}};
x = 3出力例1
特別な行列内でxと等しい要素の個数: 4
入力例2
matrix[row][col] = {
{10, 20, 30},
{30, 40, 30},
{30, 40, 50}};
x = 30出力例2
特別な行列内でxと等しい要素の個数: 4
アルゴリズムの考え方
- 行列
mat[][]と探索対象の値xを入力として受け取ります。 count関数内で、条件に一致する要素の個数をカウントします。- 行列全体を二重ループで走査し、
matrix[i][j] == xとなる要素が見つかるたびにカウントを1増やします。 - 最終的なカウント値を返し、結果として画面に出力します。
この手法の計算量は O(row × col) であり、行列のサイズに比例して処理時間が増加します。シンプルな線形探索のため、実装も容易で理解しやすいのが特徴です。
C++による実装例
#include<bits/stdc++.h>
using namespace std;
#define row 3
#define col 3
// xと等しい要素の個数をカウントする関数
int count (int matrix[row][col], int x){
int count = 0;
// 行列を走査して一致する要素を探す
for(int i = 0 ;i<row;i++){
for(int j = 0; j<col; j++){
if(matrix[i][j] == x){
count++;
}
}
}
// カウント値を返す
return count;
}
int main(){
int matrix[row][col] = {
{1, 2, 3},
{3, 4, 3},
{3, 4, 5}
};
int x = 3;
cout<<"特別な行列内でxと等しい要素の個数: "<<count(matrix, x);
return 0;
}実行結果
上記のコードをコンパイルして実行すると、次の出力が得られます。
特別な行列内でxと等しい要素の個数: 4
このように、二重ループによる単純な走査だけで、行列内の特定の値を持つ要素を効率よく数えることができます。行列のサイズが大きくなる場合は、並列処理やより高度なアルゴリズムを検討するとよいでしょう。
-
C++で行列を移動する経路の数を数える方法
問題概要 行数 row × 列数 col の2次元行列が与えられます。目的は、セル (0,0) からセル (row, col) まで、「右」と「下」の移動のみを使って到達する方法が何通りあるかを数えることです。つまり、最初の移動は (0,0) → (0,1)(下方向)または (0,0) → (1,0)(右方向)のいずれかであり、(1,1) への斜め移動は認められません。 具体例 入力 col = 2; row = 4 出力 行列を移動する方法の数: 4 説明 セル (0,0) からセル (2,4) まで到達する経路は、以下の図のように表せます。 入力 col = 4; row = 3 出力
-
C++でマンハッタン距離と等しい距離を持つパスの数を求める方法
2次元座標系上の2つの点 (x1, y1) と (x2, y2) を表す変数 x1、x2、y1、y2 が与えられます。この記事の目的は、これら2点間のマンハッタン距離と等しい距離を持つすべてのパスの総数を求めることです。 マンハッタン距離とは 2点 (x1, y1) と (x2, y2) の間のマンハッタン距離は、次の式で定義されます。 MD = |x1 − x2| + |y1 − y2| ここで、A = |x1 − x2|、B = |y1 − y2| とおきます。 マンハッタン距離と等しい距離を持つすべてのパスは、合計 (A + B) 本の移動で構成されます。そのうち A 本が水平方向の移動