マナビング基本情報技術者

二次元配列の回転で添字はどう対応するか

基本情報技術者試験 令和元年度秋期 午前 問9 / アルゴリズムとプログラミング › アルゴリズム

過去問にチャレンジ

令和元年度秋期 午前 問9

配列Aが図2の状態のとき,図1の流れ図を実行すると,配列Bが図3の状態になった。図1のaに入れる操作はどれか。ここで,配列A,Bの要素をそれぞれ A(i,j),B(i,j) とする。

令和元年度秋期 午前 問9の図
  1. ア

    B(7-i,7-j) ← A(i,j)

  2. イ

    B(7-j,i) ← A(i,j)

  3. ウ

    B(i,7-j) ← A(i,j)

  4. エ

    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になっています。この対応をほかの印でも確かめて選びます。

選択肢ごとの解説

  1. ×ア  B(7-i,7-j) ← A(i,j)
    行と列をどちらも7から引く操作は、180度回転に当たります。この式ではA(0,6)がB(7,1)に移りますが、図3のその位置に印はありません。
  2. ×イ  B(7-j,i) ← A(i,j)
    元の列を7から引いて移動先の行にする操作は、反時計回りの90度回転に当たります。A(3,1)はB(6,3)に移りますが、図3のその位置に印はありません。
  3. ×ウ  B(i,7-j) ← A(i,j)
    行をそのままにして列だけを7から引く操作は、左右の反転に当たります。A(0,6)はB(0,1)に移りますが、図3のその位置に印はありません。
  4. ○エ  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から引きます。

※出典:令和元年度秋期 基本情報技術者試験 午前 問9(一部改変)