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行目のすべての要素を左から右へ出力する。
- 対角線上の要素を出力する。具体的には、
i = 1, j = n-2から開始し、iを増やしながらjを減らしていく。これにより右上から左下へ向かう斜めの要素が順に出力される。 - 最終行のすべての要素を左から右へ出力する。
疑似コード:printMatrixZ(mat)
Begin
1行目を出力する
i := 1, j := n-2
while i < n かつ j >= 0 の間、繰り返す
mat[i, j] を出力する
i := i + 1, j := j - 1
done
最終行を出力する
EndC++による実装例
それでは、実際の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) 程度の走査回数で済むため、非常に効率的なアルゴリズムです。
-
C++で対合行列(インボリュートリー行列)を判定するプログラムの実装方法
行列 M[r][c] が与えられたとき、「r」は行数、「c」は列数を表します。ここでは r = c、つまり正方行列である場合を考えます。この記事では、与えられた正方行列が対合行列(インボリュートリー行列)であるかどうかを判定する方法を解説します。 対合行列とは 対合行列とは、ある行列を自分自身と掛け合わせたとき、その積が単位行列になるような行列のことです。単位行列 I とは、主対角成分がすべて 1 で、それ以外の要素がすべて 0 である行列を指します。 したがって、行列 M が対合行列であるための必要十分条件は次のように表せます。 M × M = I ここで、M は任意の行列、I は単位行列で
-
C++でグラフの隣接行列を実装する方法【サンプルコード付き解説】
隣接行列とは グラフの隣接行列(Adjacency Matrix)とは、V×Vのサイズを持つ正方行列のことです。ここでVはグラフGの頂点数を表します。行列の行と列にはそれぞれ頂点が対応付けられ、頂点iから頂点jへの辺が存在する場合は、i行目・j列目の要素に1が格納されます(重み付きグラフの場合は、辺の重みなどの非ゼロの値が入ります)。辺が存在しない場合は0が格納されます。 なお、無向グラフの場合、辺は双方向につながりを持つため、隣接行列は必ず対称行列になります。つまり、adj[i][j]とadj[j][i]は常に同じ値となります。 隣接行列表現の計算量 空間計算量: 隣接行列にはO(V²)