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

C++でマトリックス(行列)をZ字形に出力する方法を解説

この記事では、マトリックス(2次元配列)の要素をZ字形の順序で出力する方法を解説します。Z字形の出力とは、まず1行目を左から右へ、次に右から左への対角線上の要素、最後に最終行を左から右へと出力することで、文字どおり「Z」の形に沿って要素をたどる手法です。

例として、次のような4×4の行列を考えてみましょう。

5 8 7 1
2 3 6 4
1 7 8 9
4 8 1 5

この行列をZ字形で出力すると、結果は以下のようになります。

5 8 7 1 6 7 4 8 1 5

アルゴリズムの考え方

処理の手順はシンプルで、次の3つのステップで構成されます。

  1. 1行目のすべての要素を左から右へ出力する。
  2. 対角線上の要素を出力する。具体的には、i = 1, j = n-2 から開始し、i を増やしながら j を減らしていく。これにより右上から左下へ向かう斜めの要素が順に出力される。
  3. 最終行のすべての要素を左から右へ出力する。

疑似コード:printMatrixZ(mat)

Begin
    1行目を出力する
    i := 1, j := n-2
    while i < n かつ j >= 0 の間、繰り返す
        mat[i, j] を出力する
        i := i + 1, j := j - 1
    done
    最終行を出力する
End

C++による実装例

それでは、実際のC++コードを見てみましょう。

#include<iostream>
#define MAX 4
using namespace std;
void printMatrixZ(int mat[][MAX], int n){
    // 1行目を出力
    for(int i = 0; i<n; i++){
        cout << mat[0][i] << " ";
    }
    // 対角線上の要素を出力
    int i = 1, j = n-2;
    while(i < n && j >= 0){
        cout << mat[i][j] << " ";
        i++;
        j--;
    }
    // 最終行を出力
    for(int i = 1; i<n; i++){
        cout << mat[n-1][i] << " ";
    }
}
main() {
    int matrix[][MAX] = {{5, 8, 7, 1},
        {2, 3, 6, 4},
        {1, 7, 8, 9},
        {4, 8, 1, 5}
    };
    printMatrixZ(matrix, 4);
}

コードのポイント

  • 最初のforループでは mat[0][i] を参照して1行目を出力します。
  • whileループでは i を1ずつ増加させ、j を1ずつ減少させることで、反対側の対角線をなぞります。
  • 最後のforループは i = 1 から始めている点に注意してください。これは1行目の出力時にすでに先頭要素 mat[n-1][0] が対角線処理で出力済みであるため、重複を避けるためです。

実行結果

5 8 7 1 6 7 4 8 1 5

このように、1行目「5 8 7 1」→ 対角線「6 7」→ 最終行「4 8 1 5」の順に要素が出力され、Zの字形どおりの走査が実現できています。計算量は行列のサイズを n×n とすると O(n) 程度の走査回数で済むため、非常に効率的なアルゴリズムです。

  1. C++で対合行列(インボリュートリー行列)を判定するプログラムの実装方法

    行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表します。ここでは r = c、つまり正方行列である場合を考えます。この記事では、与えられた正方行列が対合行列(インボリュートリー行列)であるかどうかを判定する方法を解説します。 対合行列とは 対合行列とは、ある行列を自分自身と掛け合わせたとき、その積が単位行列になるような行列のことです。単位行列 I とは、主対角成分がすべて 1 で、それ以外の要素がすべて 0 である行列を指します。 したがって、行列 M が対合行列であるための必要十分条件は次のように表せます。 M × M = I ここで、M は任意の行列、I は単位行列で

  2. C++でグラフの隣接行列を実装する方法【サンプルコード付き解説】

    隣接行列とは グラフの隣接行列(Adjacency Matrix)とは、V×Vのサイズを持つ正方行列のことです。ここでVはグラフGの頂点数を表します。行列の行と列にはそれぞれ頂点が対応付けられ、頂点iから頂点jへの辺が存在する場合は、i行目・j列目の要素に1が格納されます(重み付きグラフの場合は、辺の重みなどの非ゼロの値が入ります)。辺が存在しない場合は0が格納されます。 なお、無向グラフの場合、辺は双方向につながりを持つため、隣接行列は必ず対称行列になります。つまり、adj[i][j]とadj[j][i]は常に同じ値となります。 隣接行列表現の計算量 空間計算量: 隣接行列にはO(V²)