C++で正方行列の2つの対角線に共通する行ごとの要素を数える方法
入力として2次元の正方行列が与えられたとき、主対角線(左上から右下にかけての対角線)と副対角線(右上から左下にかけての対角線)の両方に共通する要素、すなわち同じ行位置で値が一致している要素を見つけるのが本記事の目的です。
例として、次のような入力行列を考えてみましょう。
1 2 3 2 2 4 1 4 7
この場合、主対角線は「1 2 7」、副対角線は「3 2 1」であり、両方に共通する要素は「2」です。
なお、両対角線には必ず少なくとも1つの共通要素が存在するものとします。
実行例
例1
入力 − Matrix[][5] = {{1, 2, 1}, {4, 1, 6}, {1, 8, 1}};
出力 − 対角線上の行ごとの共通要素数:3
説明 − 与えられた行列は以下の通りです。
1 2 1 4 1 6 1 8 1
主対角線は「1 1 1」、副対角線も「1 1 1」となるため、3つの値すべてが共通しています。したがって count = 3 となります。
例2
入力 − Matrix[][5] = {{1, 4, 4, 1}, {3, 4, 4, 6}, {1, 1, 1, 4}, {1, 9, 9, 2}};
出力 − 対角線上の行ごとの共通要素数:3
説明 − 与えられた行列は以下の通りです。
1 4 4 1 3 4 4 6 1 1 1 4 1 9 9 2
主対角線は「1 4 1 2」、副対角線は「1 4 1 1」であり、最初の3つの値が共通しています。したがって count = 3 となります。
プログラムで用いるアプローチ
このアプローチでは、まず0行目から順に行ごとに正方行列を走査します。各行について、要素 M[i][i](主対角線上の要素)と M[i][size-i-1](副対角線上の要素)が等しいかどうかを確認します。等しい場合、その要素は両対角線に共通するため、カウントを1増やします。
入力行列 Matrix[][5] を受け取ります。
行列のサイズを設定します。
関数 countElement(int mt[][5], int size) は、入力行列とそのサイズを受け取り、主対角線と副対角線に共通する値の個数を返します。
カウントの初期値を0とします。
forループを使い、i = 0 から i = size-1 まで順に走査します。
mt[i][i] == mt[i][size-i-1] が成り立てば、count をインクリメントします。
最後に count を結果として返します。
main関数内で結果を出力します。
サンプルコード
#include <iostream>
using namespace std;
int countElement(int mt[][5], int size){
int count = 0;
for (int i=0;i<size;i++){
if (mt[i][i] == mt[i][size-i-1]){
count=count+1;
}
}
return count;
}
int main(){
int Matrix[][5] = {{1, 2, 1}, {4, 1, 6}, {1, 8, 1}};
int size=3;
cout<<"Row-wise common elements in diagonals:"<<countElement(Matrix, size);
return 0;
}
出力結果
上記のコードを実行すると、次の出力が得られます。
Row-wise common elements in diagonals:3
-
C++で行列を走査する方法:行優先トラバーサルと列優先トラバーサルの徹底解説
行列の走査には2つの方法がある2次元行列(マトリックス)の要素を訪問する方法は、大きく分けて2種類あります。行優先(Row-wise)トラバーサルでは、1行目から順に、各行の要素を先頭のインデックスから最後のインデックスまで左から右へと訪問していきます。すべての行を処理し終えるまで、これを繰り返します。一方、列優先(Column-wise)トラバーサルでは、1列目から最終列目へ向かって、各列の要素を上から下へと順番に訪問します。インデックスの基本的な考え方2次元行列 M[i][j] において、インデックス i は行、インデックス j は列を表します。行優先トラバーサルの場合は、次の順序でアクセ
-
C++で2つの二分探索木の全要素を昇順リストとして取得する方法
問題の概要2つの二分探索木(BST:Binary Search Tree)が与えられたとき、両方の木に含まれるすべての要素を昇順に並べたリストを返すことを考えます。例えば、次のような2つの二分探索木があるとします。木1:[2,1,4]木2:[1,0,3]この場合、出力は [0,1,1,2,3,4] となります。重複する値(この例では「1」)もそのまま保持される点に注意してください。解決のためのアプローチこの問題は、各BSTに対して反復的な中順走査(inorder traversal)を行い、マージソートのように2つの走査結果を統合することで効率的に解けます。手順は以下の通りです。結果を格納する