プログラムの位置計算と反復処理
要点と定義
幅が一定の二次元配列を行ごとに隙間なく一次元へ並べると、座標(列 x、行 y)に対応する添字は「y × 幅 + x」です。先に y 行分の要素を飛び越え、行内で x 個進む計算です。逆に一次元添字を座標へ戻すときは、幅で割った商が行、余りが列になります。幅七、添字十八なら、商は二、余りは四なので、行二・列四です。この商と余りの使い分けが、迷路の文字列内の位置計算と座標復元に直接必要です。
座標上の移動は、現在位置に方向の変位を加えて求めます。東を(+一、〇)、北を(〇、−一)と定めた場合、位置(二、三)から東へ進む候補は(三、三)です。候補が通路かどうかを確認してから現在位置を更新します。方向を一定順の列挙値で表すなら、左回転は一つ前の値です。先頭より前へ戻る場合は末尾へ折り返します。列挙値を配列で扱うときに有効な添字を保つ仕組みも、この設問の判断に必要です。
ビット領域のように、複数の語を連続した一つの領域として扱う場合も、位置を商と余りに分けます。語幅が十六ビットなら、ビット位置を十六で割った商が語の相対位置、余りが語内位置です。例えば位置四十四は、語位置二、語内位置十二です。この問題では語の最上位ビットを語内位置零としているため、数え方の基準も確認します。
語境界をまたぐ対象ビット列は、語ごとに分けて処理します。語幅を W、現在の語内位置を p とすると、その語で扱えるビット数は W−p です。対象長がその数以上なら、現在の語の分を処理して残り長から差し引き、次の語へ進みます。対象長がそれより短ければ、残った分だけのマスクを作り、語内位置に合わせます。十六ビット語の位置十二から二十四ビットを扱う例では、最初の語で処理できるのは四ビット、残りは二十ビットです。ビット長が零なら操作せず終了します。語内位置、語幅、残り長の関係を追うことが、この設問で命令や終了条件を判断するために必要です。
繰返し処理は、初期値、継続条件、更新、終了条件を一組として読みます。ファイルから一バイト読むたびに件数を一増やし、終端を示す値が返ったら止めるなら、終端値は読み込んだバイト数に含めません。文字コードを六十四行四列に並べる例では、行の開始値 i から i、i+六十四、i+百二十八、i+百九十二を扱います。つまり一行内では六十四ずつ進み、四列分を出力します。この読み方により、成功した読み込みの件数と、配列走査の範囲・間隔を適切に判断できます。
並べ替えでは、求める優先順位を隣り合う要素の交換条件にします。販売額を降順、同額なら日付を昇順にする場合、左の販売額が右より小さいとき、または販売額が同じで左の日付が右より後のときに交換します。金額の比較と、同額時だけの日付比較を分けることで、二つの順序を両立できます。
配列の添字は、同じ数値でも指す対象が異なることがあります。入力データを走査する i と、会員番号を照合して得た集計配列の行 index は別の役割です。販売データの i 行から金額を読み、照合で得た index 行へ加算します。出力ループで列を表す j を動かすときは、配列の同じ行にある会員番号・販売額・最終販売日の三項目を、列番号〇、一、二の順に出力列へ対応させます。行添字と列添字の役割を見分けることが、集計と出力の判断に必要です。
適用条件と例
「行 × 幅 + 列」の式は、すべての行の幅が一定で、要素が隙間なく並んでいる場合に使えます。幅七の配列の列四・行二なら、二 × 七 + 四 で添字十八です。幅が行ごとに異なる構造や、改行などの区切りも格納する文字列には、そのまま適用できません。また、求めた座標や添字が配列の有効範囲内かは別途確認します。
商と余りで座標を復元する例は、正の幅と非負の添字を前提にしています。添字十八、幅七なら、商二が行、余り四が列です。負の値を扱うときは、言語ごとの整数除算や剰余の規則が影響するため、この対応をそのまま使わず規則を確かめます。方角の変位も、軸の向きを先に決めてから加算します。例えば北を y の減少方向と定めたなら、北へ一歩進む変位は y に負の一を足すことです。
この節の続き
- 誤りやすい点
ここまでが冒頭部分です。ログインすると、無料でも1日2節まで全文をお読みいただけます。
アプリでこの節を読む