C++で魔方陣の欠けている対角要素を埋める方法
魔方陣の対角要素を埋める問題とは
3×3の行列を考えます。この行列の対角要素(左上・中央・右下の要素)は、初期状態では空(0)になっています。行の合計、列の合計、対角線の合計がすべて等しくなるように、空いている対角要素を埋めるのがこの問題の目的です。
例として、次のような行列を考えてみましょう。
| 0 | 3 | 6 |
| 5 | 0 | 5 |
| 4 | 7 | 0 |
対角要素を適切な値で埋めると、行列は次のようになります。
| 6 | 3 | 6 |
| 5 | 5 | 5 |
| 4 | 7 | 4 |
この結果、すべての行・列・対角線の合計が15で一致しており、正しく魔方陣が完成していることが確認できます。
対角要素を求める計算式
対角要素を x(左上)、y(中央)、z(右下)とすると、それぞれ次の式で求められます。なお、ここでの添字は1から始まる表記です。
- x = (M[2,3] + M[3,2]) / 2
- z = (M[1,2] + M[2,1]) / 2
- y = (x + z) / 2
3×3の魔方陣では、行・列・対角線の合計がすべて等しいという性質が成り立つため、対角要素以外の8つの値が分かれば、残りの3つの対角要素は上記の式で一意に決まります。
C++での実装例
以下は、上記の計算式を使って対角要素を埋める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, 7, 6 },
{ 9, 0, 1 },
{ 4, 3, 0 }};
cout << "元の行列" << endl;
displayMatrix(matrix);
fillDiagonal(matrix);
}
実行結果
元の行列
0 7 6
9 0 1
4 3 0
埋め込み後の行列
2 7 6
9 5 1
4 3 8
コードの解説
fillDiagonal関数では、対角要素以外の値を組み合わせて、3つの対角要素を順に計算しています。
- matrix[0][0](左上)は、対角線上にない要素 matrix[1][2] と matrix[2][1] の平均から求めます。
- matrix[2][2](右下)は、matrix[0][1] と matrix[1][0] の平均から求めます。
- matrix[1][1](中央)は、求めた左上と右下の値の平均から求めます。
実行結果を見ると、各行・各列・両対角線の合計がすべて15で一致しており、対角要素が正しく埋められていることがわかります。
-
C++で行列が魔方陣(マジックスクエア)かどうかを判定する方法
本記事では、与えられた正方行列が魔方陣(マジックスクエア)であるかどうかをC++で判定する方法を解説します。 魔方陣とは? 魔方陣とは、各行・各列、そして両対角線上の要素の合計値がすべて等しくなるような正方行列のことです。この共通の合計値は「魔定数」と呼ばれることもあります。 例として、次のような3×3の行列を考えてみましょう。 618753294 この行列を確認すると、以下のすべての合計が 15 で一致していることがわかります。 1行目:6 + 1 + 8 = 15 2行目:7 + 5 + 3 = 15 3行目:2 + 9 + 4 = 15 1列目:6 + 7 + 2 = 15 2列目:1
-
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 列目