C++で2つの行列が同一かどうかを判定するプログラム
ここでは、行数 r・列数 c を持つ2つの行列 M1[r][c] と M2[r][c] が与えられたときに、その2つの行列が同一であるかどうかを判定します。同一であれば「Matrices are identical(行列は同一)」と出力し、同一でなければ「Matrices are not identical(行列は同一ではない)」と出力します。
同一の行列とは?
2つの行列 M1 と M2 が「同一」であるとみなされるのは、以下の条件を満たす場合です。
- 両方の行列の行数と列数が一致していること。
- すべての要素で M1[i][j] == M2[i][j] が成り立つこと。
例えば、次の3×3の行列 m1 と m2 は同一の行列です。
M1 = | 1 2 3 |
| 4 5 6 |
| 7 8 9 |
M2 = | 1 2 3 |
| 4 5 6 |
| 7 8 9 |
入力例と出力
入力1:
a[n][n] = { {2, 2, 2, 2},
{2, 2, 2, 2},
{3, 3, 3, 3},
{3, 3, 3, 3}};
b[n][n] = { {2, 2, 2, 2},
{2, 2, 2, 2},
{3, 3, 3, 3},
{3, 3, 3, 3}};
出力: matrices are identical(行列は同一)
入力2:
a[n][n] = { {2, 2, 2, 2},
{2, 2, 1, 2},
{3, 3, 3, 3},
{3, 3, 3, 3}};
b[n][n] = { {2, 2, 2, 2},
{2, 2, 5, 2},
{3, 3, 3, 3},
{3, 3, 3, 3}};
出力: matrices are not identical(行列は同一ではない)
考え方(アプローチ)
2つの行列 a[i][j] と b[i][j] を先頭から順に走査し、対応する要素同士が等しいか(a[i][j] == b[i][j])を確認します。すべての要素が等しければ2つの行列は同一であり、1つでも異なる要素が見つかった時点で同一ではありません。このように、不一致が見つかった時点で処理を打ち切ることで、無駄な比較を省いて効率的に判定できます。
アルゴリズム
開始
ステップ1 → マクロを定義する: #define n 4
ステップ2 → 行列が同一かどうかを判定する関数を宣言する
int check(int a[][n], int b[][n])
int i, j を宣言
i = 0 から i < n まで i++ しながらループ
j = 0 から j < n まで j++ しながらループ
もし (a[i][j] != b[i][j]) ならば
return 0
終了
終了
終了
return 1
ステップ3 → main() 内で
変数を宣言: int a[n][n] = { {2, 2, 2, 2},
{2, 2, 2, 2},
{3, 3, 3, 3},
{3, 3, 3, 3}}
別の変数を宣言: int b[n][n] = { {2, 2, 2, 2},
{2, 2, 2, 2},
{3, 3, 3, 3},
{3, 3, 3, 3}}
もし (check(a, b)) ならば
「matrices are identical」を出力
そうでなければ
「matrices are not identical」を出力
終了
C++実装例
#include <bits/stdc++.h>
#define n 4
using namespace std;
// 行列が同一かどうかを判定する関数
int check(int a[][n], int b[][n]){
int i, j;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (a[i][j] != b[i][j])
return 0;
return 1;
}
int main(){
int a[n][n] = { {2, 2, 2, 2},
{2, 2, 2, 2},
{3, 3, 3, 3},
{3, 3, 3, 3}};
int b[n][n] = { {2, 2, 2, 2},
{2, 2, 2, 2},
{3, 3, 3, 3},
{3, 3, 3, 3}};
if (check(a, b))
cout << "matrices are identical";
else
cout << "matrices are not identical";
return 0;
}
出力
matrices are identical
計算量について
このプログラムの時間計算量は O(n²) です。n×n の行列の全要素を最大1回ずつ比較するためです。一方、比較以外に追加のメモリを使用しないため、空間計算量は O(1) となります。また、不一致の要素が見つかった時点で直ちに return 0 するため、残りの比較をスキップできる点も実用上のメリットです。
-
C++で3つの点が同一直線上にあるかどうかを判定するプログラム
3つの異なる座標を持つ点が与えられ、それらの点が同一直線上に並んでいるかどうか(共線性・コリニア)を判定するのが本記事のテーマです。3つの点がすべて同じ直線上に乗っている場合、これらの点は「共線(collinear)」であるといいます。逆に、異なる直線上に配置されている場合は共線ではありません。以下の図は、共線な点と共線でない点の違いを示したものです。入力例と出力例入力1x1 = 1, x2 = 2, x3 = 3, y1 = 1, y2 = 4, y3 = 5出力1no points are not collinear入力2x1 = 1, y1 = 1, x2 = 1, y2 = 4, x3
-
C++で2つの木(二分木)が同一かどうかを判定する方法
この問題では、2つの二分木が与えられます。私たちの課題は、この2つの木が同一であるかどうかを判定するコードを書くことです。2つの木が「同一」であるとは、すべての対応するノードが同じ値を持ち、まったく同じ位置(構造・向き)に配置されている状態を指します。例上の2つの木は、各ノードの値も配置位置も完全に一致しているため、同一の木であると言えます。同一性判定の考え方2つの木が同一かどうかを調べるには、両方の木をルートから順番にたどりながら、対応するノード同士を1つずつ比較していきます。比較の途中で値が異なるノードが見つかった場合は、その時点で「同一ではない」と判定して処理を終了します。逆に、すべての