C++で行列を左右交互(ジグザグ順)に出力する方法
問題の概要
この記事では、2次元配列(行列)が与えられたとき、1行目は左から右へ、2行目は右から左へ、3行目は再び左から右へ…というように、行ごとに方向を交互に切り替えながらすべての要素を出力する方法を解説します。このような出力形式は「ジグザグ順」や「蛇行順」とも呼ばれます。
例で理解する
入力: array = {
{2, 5}
{4, 9}
}
出力: 2 5 9 41行目の「2, 5」は左から右へそのまま出力され、2行目の「4, 9」は右から左へ逆順に出力されるため、結果は「2 5 9 4」となります。
解決のアプローチ
この問題は、以下の手順で解くことができます。
- 各行について、現在の方向(左から右、または右から左)に従って要素を出力します。
- 出力方向を管理するためのフラグ変数を用意し、1行の出力が完了するごとに方向を反転させます。
この手法はシンプルでありながら効率的で、時間計算量は O(R×C)(Rは行数、Cは列数)です。各要素を一度だけ訪れるため、これ以上の計算量の削減は困難です。
C++での実装例
以下は、上記の解法を実装したC++プログラムです。
#include<iostream>
using namespace std;
#define R 3
#define C 3
void printAlternateMatrix(int arr[R][C]) {
bool direction = true;
for (int i = 0; i < R; i++) {
if (direction) {
// 左から右へ出力
for (int j = 0; j < C; j++)
printf("%d ", arr[i][j]);
} else {
// 右から左へ出力
for (int j = C - 1; j >= 0; j--)
printf("%d ", arr[i][j]);
}
direction = !direction; // 行ごとに方向を反転
}
}
int main() {
int arr[][C] = {
{ 23 , 50 , 4 },
{ 89 , 9 , 34 },
{ 75 , 1 , 61 },
};
cout << "交互順の行列出力:\n";
printAlternateMatrix(arr);
return 0;
}実行結果
交互順の行列出力: 23 50 4 34 9 89 75 1 61
まとめ
行列を左右交互に出力する問題は、ブール型のフラグ変数で方向を管理し、行のループごとに反転させるだけで簡単に実装できます。計算量は O(R×C) と効率的で、面接や競技プログラミングでも頻出のパターンなので、ぜひマスターしておきましょう。
-
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
-
C++で二分木のすべての葉ノードを右から左の順に出力する方法
問題概要この記事では、二分木(binary tree)が与えられたとき、そのすべての葉ノード(リーフノード)を右から左の順で出力する方法を解説します。まず、具体例を使って問題を確認しましょう。入力例出力例7 4 1この問題を解くには、二分木を走査(トラバース)する必要があります。走査のアプローチは主に次の2つがあります。方法1:前順走査(Preorder Traversal)+ 再帰前順走査は再帰を用いた手法で、通常は「根 → 左部分木 → 右部分木」の順にノードを訪問します。ただし今回は右から左へ出力する必要があるため、再帰呼び出しの順序を「右部分木 → 左部分木」にするのがポイントです。葉