C言語で行列をスネークパターンで出力する方法(最後の列から開始)
n×nサイズの2次元配列が与えられたとき、元のデータの並びを一切変更せずに、最後の列から蛇行(スネーク)パターンで要素を出力するプログラムをC言語で作成します。つまり、各行の末尾(arr[i][n-1])から出力を始め、行ごとに方向を交互に切り替えながら全体をなぞっていくイメージです。
処理のイメージ
例えば以下のような4×4の行列があるとします。
Input: arr[]= 100 99 98 97 93 94 95 96 92 91 90 89 85 86 87 88 Output: 97 98 99 100 96 95 94 93 92 91 90 89 88 87 86 85
1行目は右から左へ、2行目は左から右へ、3行目は再び右から左へ…というように、行ごとに走査方向を反転させながら出力することで、蛇が這うようなパターンになります。
アルゴリズム
基本的な考え方はシンプルです。行番号 i の偶奇を判定し、偶数行なら列を逆順(右→左)に、奇数行なら正順(左→右)に走査します。
START Step 1 -> 変数 n=5、i、j を宣言する Step 2 -> 要素を持つ2次元配列を宣言する Step 3 -> i=0 から i<n まで繰り返す IF i%2==1 の場合(奇数行) j=0 から j<n まで j++ しながら繰り返す arr[i][j] を出力する 繰り返し終了 End Else(偶数行) j=n-1 から j>=0 まで j-- しながら繰り返す arr[i][j] を出力する 繰り返し終了 End STOP
C言語での実装例
実際のコードは以下の通りです。外側の for ループで行をたどり、内側のループで列方向の出力順序を切り替えています。
#include <stdio.h>
int main(){
int n = 5;
int arr[][5]= {
{10, 20, 30, 40, 50},
{ 60, 70, 80, 90, 100 },
{ 110, 120, 130, 140, 150 },
{ 160, 170, 180, 190, 200 },
{ 210, 220, 230, 240, 250 }
};
for (int i = 0; i < n; i++) { // 最後の列から開始するため行ごとに判定
if (i%2 == 1)
for (int j = 0; j < n; j++)
printf("%d ", arr[i][j]);
else
for (int j = n - 1; j >= 0; j--)
printf("%d ", arr[i][j]);
}
return 0;
}実行結果
上記のプログラムを実行すると、次のような出力が得られます。
50 40 30 20 10 60 70 80 90 100 150 140 130 120 110 160 170 180 190 200 250 240 230 220 210
ポイントの解説
- 偶奇判定(i % 2):行番号が偶数か奇数かで走査方向を決めることで、余計なフラグ変数を使わずに済みます。
- 元の配列は無変更:この手法は出力順序だけを制御するため、配列そのものをソートしたり反転したりする必要がなく、計算コストも最小限です。
- 計算量:すべての要素を一度ずつ訪れるため、時間計算量は O(n²)、追加のメモリ使用量は O(1) です。
このように、単純な条件分岐と二重ループを組み合わせるだけで、行列をスネークパターンで効率よく出力できます。面接や競技プログラミングでも頻出の定番テクニックなので、ぜひ覚えておきましょう。
-
C++で行列の各列の0の個数に基づいて列をソートし、インデックスを出力する方法
N行M列のサイズを持つ行列が与えられたとき、各列に含まれる0の個数を数え、その個数に基づいて列をソートし、ソート後の列のインデックスを出力するのが課題です。 例えば、1列目に0が1つ含まれ、2列目には0がまったく含まれず、3列目に0が2つ含まれている場合、0の少ない順に並べると出力は「2 1 3」になります。 入力例と出力例 Input: 0 0 0 1 1 1 1 0 1 Output: 1 3 2 解説 上記の入力における各列の0の個数は次のとおり
-
C++プログラム:配列内の各要素の最後の出現を相対的な順序で出力する方法
配列 a[] が与えられたとき、リスト内の各要素について最後に出現したものだけを出力するのが本記事の目的です。ここでは単純に重複要素を削除するだけでなく、各要素が配列内で最後に出現したタイミングに基づき、元の相対的な順序を維持したまま出力する必要があります。例えば、6つの要素を持つ配列 {1, 3, 2, 3, 1, 2} には重複した値が含まれています。この場合、期待される結果は「3 1 2」になります。入力例と出力例Input: a[]={4,2,2,4,1,5,1} Output : 2 4 5 1この例では、「2」はインデックス2で最後に出現し、「4」はインデックス3、「5」はインデッ