C++で行列の2つの対角線の合計の差を求める方法
本記事では、与えられた行列における2つの対角線(主対角線と副対角線)の要素の合計の差を求める方法について解説します。N×Nの正方行列が与えられたとき、まず主対角線と副対角線それぞれの合計を計算し、その差の絶対値を求めて結果として返します。
アルゴリズムの考え方
主対角線(左上から右下へ向かう対角線)では、行インデックスと列インデックスが同時に増加していきます。つまり、matrix[i][i] の要素を順に加算することで合計を求められます。
一方、副対角線(右上から左下へ向かう対角線)では、行インデックスと列インデックスの間に「row_index = n − 1 − col_index」という関係が成り立ちます。したがって、matrix[i][n-i-1] の要素を加算していけばよいことになります。
両方の対角線の合計を求めた後、それらの差の絶対値を abs() 関数で計算して返します。
サンプルコード
#include<iostream>
#include<cmath>
#define MAX 100
using namespace std;
int diagonalSumDifference(int matrix[][MAX], int n) {
int sum1 = 0, sum2 = 0;
for (int i = 0; i < n; i++) {
sum1 += matrix[i][i];
sum2 += matrix[i][n-i-1];
}
return abs(sum1 - sum2);
}
// 動作確認用プログラム
int main() {
int n = 3;
int matrix[][MAX] = {
{11, 2, 4},
{4 , 5, 6},
{10, 8, -12}
};
cout << "Difference of the sum of two diagonals: " << diagonalSumDifference(matrix, n);
}出力結果
Difference of the sum of two diagonals: 15
処理の流れの確認
上記の例では、3×3の行列を使用しています。
- 主対角線の要素:11 + 5 + (−12) = 4
- 副対角線の要素:4 + 5 + 10 = 19
したがって、差は |4 − 19| = 15 となり、出力結果と一致します。
このアルゴリズムの時間計算量は O(n) であり、行列を一度走査するだけで両方の対角線の合計を同時に求められるため、非常に効率的です。
-
二分木の2つのノード間の距離を求めるクエリ – C++でのO(log n)手法
この問題では、二分木とQ個のクエリが与えられます。私たちのタスクは、C++でO(log n)の計算量を使って、二分木の2つのノード間の距離を求めるプログラムを作成することです。問題の概要各クエリでは、二分木の2つのノードが与えられ、その2つのノード間の距離を求める必要があります。ここでの「距離」とは、一方のノードからもう一方のノードに到達するために通過する必要がある辺(エッジ)の数を意味します。具体例を見て問題を理解しましょう。入力:二分木クエリ数 = 3 [2, 6] [4, 1] [5, 3]出力:3, 2, 3解決アプローチこの問題を解くには、最小共通祖先(LCA:Lowest Comm
-
C++でグラフ内の2つのノード間の経路を探索するプログラム
本記事では、C++を使って、与えられたグラフ上であるノード(頂点)から別のノードへ到達可能かどうかを判定するプログラムを紹介します。グラフの探索には、キューを用いた幅優先探索(BFS)を活用します。 アルゴリズムの流れ 始点 s から終点 d への到達可能性を判定する関数 isReach() は、以下の手順で動作します。 すべての頂点を「未訪問」として初期化します。 現在のノード(始点)を訪問済みとしてマークし、キューに追加します。このキューは、各頂点の隣接頂点を順に処理するために使用されます。 キューから頂点を取り出し(デキュー)、その隣接頂点をすべて取得します。 隣接頂点がまだ訪問されて