C++で3×3行列の対角要素を埋め、行・列・対角線の合計をすべて等しくする方法
3×3の行列があり、最初は対角要素が空になっているとします。ここで、行・列・対角線の合計がすべて等しくなるように対角要素を埋めることを考えます(いわゆる魔方陣の性質です)。元の行列は以下のようになっているとします。

対角要素を埋めた後は、次のようになります。

対角要素の求め方
対角要素を x、y、z とすると、それぞれの値は次の式で求められます。
- x = (M[2, 3] + M[3, 2]) / 2
- z = (M[1, 2] + M[2, 1]) / 2
- y = (x + z) / 2
これは、「行・列・対角線の合計がすべて等しい」という条件を連立させることで、対角要素が残りの6つの要素から一意に導き出せることを利用したものです。まず、両端の対角要素 x と z をそれぞれ反対側の行・列の要素から計算し、その平均として中央の y を求めます。
C++による実装例
#include<iostream>
using namespace std;
void displayMatrix(int matrix[3][3]) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << matrix[i][j] << " ";
cout << endl;
}
}
void fillDiagonal(int matrix[3][3]) {
matrix[0][0] = (matrix[1][2] + matrix[2][1]) / 2;
matrix[2][2] = (matrix[0][1] + matrix[1][0]) / 2;
matrix[1][1] = (matrix[0][0] + matrix[2][2]) / 2;
cout << "最終的な行列" << endl;
displayMatrix(matrix);
}
int main() {
int matrix[3][3] = {
{ 0, 3, 6 },
{ 5, 0, 5 },
{ 4, 7, 0 }};
cout << "元の行列" << endl;
displayMatrix(matrix);
fillDiagonal(matrix);
}実行結果
元の行列 0 3 6 5 0 5 4 7 0 最終的な行列 6 3 6 5 5 5 4 7 4
計算結果の検証
この例では、x = (5 + 7) / 2 = 6、z = (3 + 5) / 2 = 4、y = (6 + 4) / 2 = 5 となります。埋めた後の行列を確認すると、各行・各列・各対角線の合計がすべて 15 になっており、条件を満たしていることがわかります。
-
C++で対角行列・スカラー行列を判定するプログラムの書き方
行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表し、r = c のとき正方行列となります。本記事では、与えられた正方行列が対角行列であるか、スカラー行列であるかを判定し、該当する場合には「yes」を出力する方法を解説します。 対角行列とは 正方行列 m[][] が対角行列であるのは、主対角線以外の要素がすべてゼロである場合、かつその場合に限ります。 下図のように、赤色で示された要素が主対角成分(非ゼロ)であり、それ以外の要素はすべてゼロになっているため、この行列は対角行列です。 入出力例 Input: m[3][3] = { {7, 0, 0}, {0, 8, 0}
-
C#で行ごと・列ごとにソートされた行列を効率的に検索する方法
この問題に対する最も基本的な解決策は、入力行列に格納されたすべての要素を順番に走査し、目的のキーを探すというものです。この線形探索アプローチでは、行列のサイズが M×N の場合、計算量は O(MN) となり、大規模なデータでは非効率になります。しかし、この行列は「ソート済みの1次元配列」とみなすことができます。実際、入力行列のすべての行を上から下の順に連結すると、昇順に並んだ1次元配列が形成されます。そのため、この2次元配列に対しては二分探索(バイナリサーチ)アルゴリズムを適用するのが最適です。以下のコードでは、2次元配列と検索キーを引数として受け取り、検索の成功・失敗に応じて true また