平成27年度 秋期 午前 問6
アルゴリズム
配列に関する問題
配列 A が図2の状態のとき,図1の流れ図を実行すると,配列 B が図3の状態になった。図1の a に入れるべき操作はどれか。ここで,配列 A,B の要素をそれぞれ A(i, j),B(i, j) とする。
図(書き起こし): 流れ図と2つの配列の図(絵)。書き起こした構造は次のとおり。
図1 流れ図:
開始
ループ1 i:0, 1, 7 (注)
ループ2 j:0, 1, 7 (注)
┌───────┐
│ a │ ← ここに入れるべき操作を選ぶ
└───────┘
ループ2
ループ1
終了
(注)ループ端の繰返し指定は,変数名:初期値,増分,終値 を示す。
図2 配列 A の状態(行 i=0〜7・列 j=0〜7。`*` が入っている升だけを示す):
| i\j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 0 | * | * | * | * | * | * | ||
| 1 | * | |||||||
| 2 | * | |||||||
| 3 | * | * | * | * | ||||
| 4 | * | |||||||
| 5 | * | |||||||
| 6 | * | |||||||
| 7 | * |
図3 実行後の配列 B の状態:
| i\j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| 0 | ||||||||
| 1 | * | * | * | * | * | * | * | * |
| 2 | * | * | ||||||
| 3 | * | * | ||||||
| 4 | * | * | ||||||
| 5 | * | |||||||
| 6 | * | |||||||
| 7 |
図2 は「F」の字,図3 はそれを右へ90度回した形に見えます(原典にその説明はありません。ここでの補足です)。
- アA(i, j) → B(7−i, 7−j)
- イA(i, j) → B(7−j, i)
- ウA(i, j) → B(i, 7−j)
- エA(i, j) → B(j, 7−i)
答えと解説を見る
✓ これが正解エA(i, j) → B(j, 7−i)
解説
行と列を入れ替え、片方だけ7から引く形が答えです。
配列Aの印は、左から2列目に縦一列に並び、いちばん上の行にも横へ伸びています。配列Bではその縦の並びが横になり、横の並びが縦になっています。ですから入れるべき操作は、行の番号と列の番号を入れ替える働きを含んでいるはずです。ただし入れ替えるだけでは向きが定まらないので、どちらの番号を7から引くかも決める必要があります。確かめ方は決まっています。Aで印の付いている升をいくつか選び、候補の式に当てはめて、Bの印の位置と一致するかを見ます。Aの上端に横へ並ぶ一連の印は、Bでは右端の列に縦に並びます。Aの左寄りに縦へ並ぶ印は、Bでは上から2行目に横一列で現れます。この2つが同時に成り立つ式を選べば決まります。
ほかの選択肢はなぜ違うのか
- アA(i, j) → B(7−i, 7−j…:行の番号と列の番号を入れ替えず、どちらも7から引くだけなので、印は中心をはさんだ反対側へ移るにとどまります。上端の並びは下端へ落ちてしまい、図3の姿と合いません。
- イA(i, j) → B(7−j, i):入れ替えは含んでいますが、引き算を掛ける番号のほうが逆です。上端に横へ並ぶ印は左端の列へ移ることになり、右端に立つ図3の姿とはちょうど反対向きになります。
- ウA(i, j) → B(i, 7−j):行の番号がそのまま残るため、上端にあった印は移した先でも上端に残ります。これは左右を裏返しただけの形で、90度回した姿にはなりません。
出典:平成27年度 秋期 基本情報技術者試験 午前 問6(改変:原典の図表をテキストに書き起こした)
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)