Pythonで行列をZ字形に出力するプログラムの解説
本記事では、n×n の正方行列の要素を「Z」の字形に沿って出力する方法について、その考え方と実装の手順をわかりやすく解説します。
問題の概要
次数 n×n の正方行列が与えられたとき、その要素を Z 字形に従って順番に表示することが求められます。
Z 字形の走査は、以下の3つのステップで構成されます。
- まず、最初の行(1行目)を左から右へ走査する
- 次に、主対角線(左上から右下へ向かう対角成分)を走査する
- 最後に、最終行(最後の行)を左から右へ走査する
ここでは説明のため、あらかじめ用意した入力行列を使用して、コードの流れを示します。
サンプルコード
arr = [[1, 2, 6, 9], [1, 2, 3, 1], [7, 1, 3, 5], [1, 8, 7, 5]] n = len(arr[0]) i = 0 # 1行目を出力(右上端は対角線側で出力) for j in range(0, n-1): print(arr[i][j], end = ' ') # 主対角線を出力 k = 1 for i in range(0, n): for j in range(n, 0, -1): if(j == n-k): print(arr[i][j], end = ' ') break; k+= 1 # 最終行を出力 i = n-1; for j in range(0, n): print(arr[i][j], end = ' ')
実行結果
1 2 6 9 3 1 1 8 7 5
処理のポイント
すべての変数はグローバルスコープで宣言されており、処理全体は3つのループで構成されています。それぞれのループが、Z を描くための「上の横棒」「斜め線」「下の横棒」に対応しています。
- 第1のループ: 1行目の先頭から n-1 番目の要素までを出力します(右上端の要素は対角線の走査時に出力されるため除外)
- 第2のループ: 各行ごとに対角要素の位置(j == n-k)を特定し、その要素だけを出力します
- 第3のループ: 最終行のすべての要素を先頭から順に出力します
このアルゴリズムは行列全体を走査するわけではなく、実際に訪れる要素は約 3n 個にとどまるため、計算量は O(n) 程度に収まり、非常に効率的です。
まとめ
本記事では、正方行列の要素を Z 字形に出力するアプローチについて学びました。3つのシンプルなループを組み合わせるだけで実装できるため、配列操作や二重ループの練習としても最適な題材です。
-
C言語で正方行列をZ字形に表示するプログラム
プログラムの概要本記事では、C言語を使って正方行列の要素を「Z」の字形に沿って出力するプログラムを解説します。正方行列とは、行数と列数が等しい行列のことです。n行n列の行列は「n次の正方行列」と呼ばれ、2×2、3×3、4×4などの行列が該当します。Z字形出力のアルゴリズム行列の要素をZ字形で表示するには、次の3つの部分を順番に出力します。最上行(1行目):左端から右端までのすべての要素対角成分:右上から左下へ向かう斜めの要素(両端の角は除く)最下行(最終行):すべての要素これらを順につなげると、アルファベットの「Z」の形が完成します。3×3の行列の場合: a00 a01 a02
-
Pythonでグラフの頂点間の到達可能性行列を計算するプログラム
隣接リスト形式で表現されたグラフが与えられたとき、次のような条件を満たす2次元行列Mを求めることを考えます。M[i, j] = 1:頂点iから頂点jへの経路(パス)が存在する場合M[i, j] = 0:経路が存在しない場合例えば、次のようなグラフが入力として与えられたとします。この場合の出力は、以下の5×5の行列になります。1111101111011110111101111解法のアプローチこの問題は、各頂点を起点とした幅優先探索(BFS)を用いることで効率的に解くことができます。具体的な手順は以下の通りです。n×nの2次元行列「ans」を作成し、すべての要素を0で初期化します(nは頂点の総数)