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

C++で行列を逆波形(リバースウェーブ)形式で出力する方法

この問題では、行列が与えられ、その行列を逆波形(リバースウェーブ)の順序で1行に出力することが求められます。

問題の概要

具体例を使って問題を確認してみましょう。

入力:
1 4 6 11
2 5 8 54
7 9 3 43
1 7 4 34
出力: 11 54 43 34 4 3 8 6 4 5 9 7 1 7 2 1

この問題を解くには、行列を逆波形の順序で走査する必要があります。具体的には、まず最後の列の要素を上から下へ出力し、次に後ろから2番目の列の要素を下から上へ出力します。この上下交互の走査を、行列の最初の列に到達するまで繰り返していきます。

アルゴリズムのポイント

  • 列を右から左へ走査します(j = n-1 から 0 まで)。
  • 1つ目の列では、行を上から下へ(i = 0 から m-1 まで)出力します。
  • 2つ目の列では、行を下から上へ(i = m-1 から 0 まで)出力します。
  • フラグ変数 wave を使って、出力方向を交互に切り替えます。

実装例

上記の解法を実装したC++プログラムは以下の通りです。

#include<iostream>
using namespace std;
#define R 4
#define C 4
void printReverseWaveForm(int m, int n, int arr[R][C]) {
int i, j = n - 1, wave = 1;
while (j >= 0) {
if (wave == 1) {
for (i = 0; i < m; i++)
cout<<arr[i][j]<<" ";
wave = 0;
j--;
} else {
for (i = m - 1; i >= 0; i--)
cout<<arr[i][j]<<" ";
wave = 1;
j--;
}
}
}
int main() {
int arr[R][C] = {
{ 1, 5, 7, 98 },
{ 15, 22, 45, 12 },
{ 5, 10, 21, 34 },
{ 31, 24, 45, 60 }
};
cout<<"Reverse Wave Form of the given matrix :\n";
printReverseWaveForm(R, C, arr);
return 0;
}

出力結果

上記プログラムを実行すると、与えられた行列の逆波形が以下のように出力されます。

98 12 34 60 45 21 45 7 5 22 10 24 31 5 15 1

計算量

このアルゴリズムは行列のすべての要素をちょうど1回ずつ訪問するため、時間計算量は O(m × n) です。また、出力用の補助配列を必要としないため、空間計算量は O(1) で非常に効率的です。

  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. C++で2次元行列を反時計回りのスパイラル形式で出力する方法

    この記事では、2次元行列が与えられたときに、そのすべての要素を反時計回りのスパイラル形式で出力する方法を解説します。 反時計回りのスパイラル形式とは? 反時計回りのスパイラル形式とは、行列の左上の要素から開始し、最初に下方向へ進み、続いて右→上→左と方向を変えながら、渦巻き状に外側から内側へと要素をたどっていく走査方法です。 例として、次の4×4の行列を見てみましょう。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 この行列を反時計回りに走査すると、出力は「1 5 9 13 14 15 16 12 8 4 3 2 6 10