C++で指定された行列をジグザグ形式で出力する方法
この記事では、2次元行列が与えられたときに、その要素をジグザグ(波状)形式で出力する方法を解説します。
まず、具体例を見て問題の内容を確認しましょう。
入力: 12 99 43 10 82 50 15 75 5 出力: 12 99 43 50 82 10 15 75 5
ご覧のとおり、ジグザグ形式とは「0行目は左から右へ、1行目は右から左へ、2行目は再び左から右へ…」というように、行ごとに出力する方向を交互に切り替える方式のことです。
解決のアプローチ
この問題は、偶数番目の行を左から右(LtoR)、奇数番目の行を右から左(RtoL)に出力することで解けます。フラグ変数や行インデックスの偶奇を利用して方向を切り替えるのがポイントです。
C++による実装例
#include <iostream>
using namespace std;
void printZigZagPattern(int row, int col, int a[][5]) {
int evenRow = 0; // 偶数行:左から右へ出力
int oddRow = 1; // 奇数行:右から左へ出力
while (evenRow < row) {
for (int i = 0; i < col; i++) {
cout << a[evenRow][i] << " ";
}
evenRow = evenRow + 2;
if (oddRow < row) {
for (int i = col - 1; i >= 0; i--)
cout << a[oddRow][i] << " ";
}
oddRow = oddRow + 2;
}
}
int main() {
int r = 3, c = 3;
int mat[][5] = {
{12, 99, 43},
{10, 82, 50},
{15, 75, 5}
};
cout << "行列の要素をジグザグ形式で出力 :\\n";
printZigZagPattern(r, c, mat);
return 0;
}
出力結果
上記のプログラムを実行すると、次のように表示されます。
12 99 43 50 82 10 15 75 5
コードの解説
- evenRow(0, 2, 4…):偶数行の要素をインデックス0からcol-1に向かって、左から右へ出力します。
- oddRow(1, 3, 5…):奇数行の要素をインデックスcol-1から0に向かって、右から左へ出力します。
- 各行の処理後にインデックスを2ずつ増加させることで、出力方向を自動的に交互に切り替えています。
計算量
時間計算量: O(row × col) ― 行列の全要素を一度ずつ訪れるためです。
空間計算量: O(1) ― 追加の配列などは不要で、インデックス変数のみを使用します。
-
C++で解くスパイラル行列 III:時計回りに全マスを訪問するアルゴリズム
本記事では、R行C列の2次元グリッドを時計回りの渦巻き(スパイラル)状に巡回し、すべてのマスを訪問した順に座標を求める問題「スパイラル行列 III」をC++で解く方法を解説します。 問題の概要 R行C列の2次元グリッドを考えます。スタート地点は (r0, c0) で、最初は東向きに面しています。グリッドの北西の角は第1行・第1列に位置し、南東の角は最終行・最終列にあります。 私たちは時計回りの渦巻き状に歩きながら、グリッド内のすべてのマスを訪問します。途中でグリッドの境界外に出た場合でも、そのまま外側を歩き続け、後で再びグリッド内に戻ることがあります。 求めるのは、訪問した順番に並べたグリッド
-
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