C++
 Computer >> コンピューター >  >> プログラミング >> C++

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 するため、残りの比較をスキップできる点も実用上のメリットです。

  1. 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

  2. C++で2つの木(二分木)が同一かどうかを判定する方法

    この問題では、2つの二分木が与えられます。私たちの課題は、この2つの木が同一であるかどうかを判定するコードを書くことです。2つの木が「同一」であるとは、すべての対応するノードが同じ値を持ち、まったく同じ位置(構造・向き)に配置されている状態を指します。例上の2つの木は、各ノードの値も配置位置も完全に一致しているため、同一の木であると言えます。同一性判定の考え方2つの木が同一かどうかを調べるには、両方の木をルートから順番にたどりながら、対応するノード同士を1つずつ比較していきます。比較の途中で値が異なるノードが見つかった場合は、その時点で「同一ではない」と判定して処理を終了します。逆に、すべての