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

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つのシンプルなループを組み合わせるだけで実装できるため、配列操作や二重ループの練習としても最適な題材です。

  1. C言語で正方行列をZ字形に表示するプログラム

    プログラムの概要本記事では、C言語を使って正方行列の要素を「Z」の字形に沿って出力するプログラムを解説します。正方行列とは、行数と列数が等しい行列のことです。n行n列の行列は「n次の正方行列」と呼ばれ、2×2、3×3、4×4などの行列が該当します。Z字形出力のアルゴリズム行列の要素をZ字形で表示するには、次の3つの部分を順番に出力します。最上行(1行目):左端から右端までのすべての要素対角成分:右上から左下へ向かう斜めの要素(両端の角は除く)最下行(最終行):すべての要素これらを順につなげると、アルファベットの「Z」の形が完成します。3×3の行列の場合: a00 a01 a02

  2. Pythonでグラフの頂点間の到達可能性行列を計算するプログラム

    隣接リスト形式で表現されたグラフが与えられたとき、次のような条件を満たす2次元行列Mを求めることを考えます。M[i, j] = 1:頂点iから頂点jへの経路(パス)が存在する場合M[i, j] = 0:経路が存在しない場合例えば、次のようなグラフが入力として与えられたとします。この場合の出力は、以下の5×5の行列になります。1111101111011110111101111解法のアプローチこの問題は、各頂点を起点とした幅優先探索(BFS)を用いることで効率的に解くことができます。具体的な手順は以下の通りです。n×nの2次元行列「ans」を作成し、すべての要素を0で初期化します(nは頂点の総数)