二次元配列の回転で添字はどう対応するか
基本情報技術者試験 令和元年度秋期 午前 問9 / アルゴリズムとプログラミング › アルゴリズム
過去問にチャレンジ
配列Aが図2の状態のとき,図1の流れ図を実行すると,配列Bが図3の状態になった。図1のaに入れる操作はどれか。ここで,配列A,Bの要素をそれぞれ A(i,j),B(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)
会話形式の解説
講師印を一つ選び、移動前後の行番号と列番号を比べてみましょう。
受験者図2の行3・列1の印は、図3では行1・列4にあります。列の1が移動先の行になるのですね。
講師そうです。元の行3は、7から引いた4が移動先の列になります。つまり、A(i,j)をB(j,7-i)へ移す式です。
受験者一つの印だけで決めてよいか迷います。別の印でも確かめられますか。
講師A(0,6)を追うとB(6,7)へ移り、図3の印と一致します。二つの位置から、時計回りの90度回転だと確認できます。
受験者行と列を両方とも7から引く式も、回転には見えます。
講師それは180度回転です。A(0,6)がB(7,1)に移りますが、図3のその位置に印はありません。
受験者元の列を7から引いて移動先の行にする式は、どう違いますか。
講師反時計回りの90度回転です。A(3,1)はB(6,3)に移りますが、そこにも印はありません。
受験者行を変えず、列だけを7から引く式なら、左右が入れ替わるだけですね。
講師はい。左右反転ではA(0,6)がB(0,1)に移るので、図3とは一致しません。
受験者正解はB(j,7-i)へ移す式ですね。元の列が新しい行になり、元の行を7から引いた値が新しい列になります。
講師そのとおりです。添字が0から7までの配列なので、反対側の位置は7から引いて求めます。回転方向に迷ったら、特徴のある印を複数追って確かめましょう。
まとめ
図2から図3への変化は、時計回りの90度回転です。A(i,j)の印はB(j,7-i)へ移るので、正解はエです。A(3,1)がB(1,4)へ、A(0,6)がB(6,7)へ移ることでも確認できます。行と列の入替え方や7から引く位置が違う式は、別の回転や左右反転になります。
解答・解説
正解はエです
この問題のテーマ
配列の模様を回転させるとき、行番号と列番号をどう変換するかを問う問題です。
解き方の考え方
図2のA(3,1)にある印は、図3ではB(1,4)にあります。行と列が入れ替わり、元の行番号3は最大の添字7から引かれて4になっています。この対応をほかの印でも確かめて選びます。
選択肢ごとの解説
- ×ア B(7-i,7-j) ← A(i,j)行と列をどちらも7から引く操作は、180度回転に当たります。この式ではA(0,6)がB(7,1)に移りますが、図3のその位置に印はありません。
- ×イ B(7-j,i) ← A(i,j)元の列を7から引いて移動先の行にする操作は、反時計回りの90度回転に当たります。A(3,1)はB(6,3)に移りますが、図3のその位置に印はありません。
- ×ウ B(i,7-j) ← A(i,j)行をそのままにして列だけを7から引く操作は、左右の反転に当たります。A(0,6)はB(0,1)に移りますが、図3のその位置に印はありません。
- ○エ B(j,7-i) ← A(i,j)B(j,7-i) ← A(i,j)なら、A(3,1)はB(1,4)へ、A(0,6)はB(6,7)へ移ります。どちらも図3の印の位置と一致し、図2の配置を時計回りに90度回転できます。
POINT
- この図では、iが行番号、jが列番号を表します。
- 回転方向は、特徴のある複数の印の移動先を追うと確認できます。
- 8×8配列の添字は0から7なので、反対側の位置を求めるときは7から引きます。
