見出し画像

【情報】大学入学共通テスト過去問解説 情報関係基礎 2018年(平成30年)第3問 擬似言語プログラミング 迷路ゲーム【高校情報Ⅰ授業】

大学入学共通テスト「情報」過去問解説 情報関係基礎 2018年(平成30年)第3問


【資料ダウンロード】

PDFの他、パワーポイント、学習指導案 等の原本も無料提供しています。

情報教育の底上げが目的なので、資料を修正して、学校・塾(営利目的含む)の授業等で利用して頂いて問題ありません。私への連絡不要ですが、利用する際には、YouTubeチャンネル・情報Ⅰ動画教科書・IT用語動画辞典を紹介してもらえると嬉しいです。

■独自解説パワーポイント
https://toppakou.com/info1/download/98_大学入学共通テスト/04_H30_2018/情報大学入学共通テスト対策【情報関係基礎_平成30年(2018年)大問3】.pptx

■問題
大学入試センター 情報関係基礎過去問ダウンロード(情報処理学会 情報入試委員会)
https://drive.google.com/drive/folders/140pQJOKWzYH2-NvzPCyQdqFPHcZhCSOa

【文字おこし】

大学入学共通テスト 情報対策講座
情報関係基礎 2018年(平成30年)の大問3の擬似言語を使った迷路ゲームのプログラミング問題解説をしていきます。

白マスの道、黒マスの壁で構成された、図1の様な迷路があります。
図2は、袋小路を黒く塗って、Sと書かれたスタートからGと書かれたゴールまでの道を白いマスとして浮き出しています。塗ったマスは分かりやすくするためにグレーの色を使っています。

今回は、色々な迷路について袋小路を黒く塗る手順を考えていきます。

図3で考慮しない道の例が3つ示されています。
まずはこのような、環状になった道
そして2×2以上の道、
孤立した道 については考慮しない道になります。

1つのマスを座標x、yを用いて マスx、yで表します。
図1の例ではスタートはマス(4,1) ゴールはマス(8、9)にあることになります。

では、問1部分に入っていきます。
道のマスで、この部分のように上下左右のうち三方が壁であるものを行き止まりと呼びます。
行き止まりのマスは、袋小路の先端で、黒く塗ることができます。塗ったマスは分かりやすいように黒ではなく、グレーを使います。
1つのマスを黒く塗ったことで、壁が発生するので、この部分のように隣接するますが新たに行き止まりになることがあります。
このように新たにできたものも含めて、すべての行き止まりを見つけて塗ることで、袋小路を塗ることができます。


手順はステップ1とステップ2があります。
ステップ1は外周を除く領域、図1では 2列2行目から10列8行目のこの範囲について、上の行から下の行に各行のマスを左から右の順に行き止まりかどうかを調べていきます。
もし行き止まりであれば、黒にします。最後のマスまで調べたら、ステップ2に行きます。

ステップ2は ステップ1で1マスも塗られてなかったら手順を終了して、そうでなければステップ1に戻ります。

実際にシミュレーションを行いながら、問題を解いて行きます。

まず、2列2行目の判定を行います。3方向が壁なので、黒く塗って壁にします。
つぎは3列2行目はすでに壁で黒なので次の4列2行目の判定に移ります。
ここは2方向が壁で2方向が道なので行き止まりには該当しない為、白のままとします。
つぎは5列2行目はすでに壁で黒なので次の6列2行目の判定に移ります。
3方向が壁なので、黒く塗って壁にします。
次の7列2行目は先ほど黒く塗った部分で行き止まりになっているので、黒く塗りつぶします。
つぎは8列2行目はすでに壁で黒なので次の9列2行目の判定に移ります。
2方向が壁で2方向が道なので行き止まりには該当しない為、白のままとします。

次の10列2行目は3方向が壁なので、黒く塗って壁にします。
折り返して次は2列3行目の判定になります。先ほど塗りつぶした部分を合わせて3方向かべなので、黒く塗りつぶします。
ここからは判定処理をアニメーションで最後まで流します。ただ、既に黒(グレー含む)の部分の判定も本来は行いますが、冗長で時間もかかるため、アニメーション上は判定をスキップしています。

―――

1回目の判定が終わりましたので、ここで該当する空欄部分を見ていきましょう。

まず最初に見つかる行き止まりのマスは2列2行目でした。
そして空欄アイは2列2行目の次に塗られる行き止まりの位置になります。
さきほどのアニメーションのとおり6列2行目になります。

そして7列3行目の次に塗るマスが空欄ウエになります。
さきほどのアニメーションのとおり2列4行目となります。
そして、空欄オカの1回目のステップ1で最後に塗られるマスは、この部分なので7列8行目となります。
そして最後の10列8行目まで来たらステップ2に移り、1つ以上黒く塗ったマスがあるので、2回目に入ります。

これもアニメーションを流していきます。
ただ、すでに黒やグレーの部分の判定も本来は行いますが、冗長で時間がかかるためアニメーション上は省略します。
最後まで判定し終わったので、2回目の判定に関する問題を確認していきましょう。
空欄キは2回目のステップ1で塗られるマスの総数が問われています。
この薄いグレー部分を数えると3個なので空欄キは3になります。

―――

3回目に入ります。これも先ほどと同じように既に黒の部分は省略した判定アニメーションを先に見ていきます。

空欄ク、ケは3回目で初めに行きどまるマスについて問われています。
先ほどのアニメーションのとおりこの部分が該当するので、列を表す空欄クは3、行を表す空欄ケは8になります。

4回目のアニメーションも見ていきましょう。
1か所だけが塗られました。

5回目のアニメーションも見ていきましょう。
これも1か所だけが塗られました。

6回目のアニメーションも見ていきましょう。
これも1か所だけが塗られました。

7回目のアニメーションも見ていきましょう。
一つも塗られなかったので、これで全ての手順が終了します。


===================
では、問2の擬似言語問題を解いて行きましょう。
先ほどの迷路を 2次元配列Masuに格納します。
理解しやすいように色も付けておきます
壁の場合は1、道の場合は0 スタートかゴールなら9を代入します。
例えば、1行1列目は壁なので、1が設定されています。


擬似言語の1行目から11行目は、先ほどのマスごとの行き止まり判定をおこない、行き止まりならMasu配列の該当部分に1つまり壁を設定します。

12行目から21行目までは、壁を黒マス、道およびスタートとゴールを白マスとして迷路を表示する処理になります。


==================
11行目までの処理に空欄がありますので、実際に値を当てはめながら処理を説明していきます。
2行目は 変数nuttaに 空欄コの値を代入しています。
11行目を見ると nuttaが 0になるまで実行するとありますので、0になったら、つまり行き止まりで黒く塗るマスが無くなったらループを抜けることができます。
7行目でnuttaを1に更新する処理があります。塗った実績があればループを継続する必要があるため1を設定しています。
塗らなかった場合の0にする処理が無いので2行目は初期値として0を入れる処理と考えられます。
よって空欄コは0となります。


3行目は 行であるy軸のループ条件となります。Y=2から空欄サまで1ずつ増やしながらとあります。先ほどの通り外枠は対象外とするので、この図で言うと9―1でyが8になるまで繰り返します。
本文にあるように、迷路の行数は変数tateに格納されているので、変数を使うとtate-1となり、選択肢としては⑥が該当します。

4行目は 列であるx軸のループ条件となります。X=2から空欄シまで1ずつ増やしながらとあります。先ほどの通り外枠は対象外とするので、この図で言うと11―1でxが10になるまで繰り返します。
本文にあるように、迷路の列数は変数yokoに格納されているので、変数を使うとyoko-1となり、選択肢としては⑦が該当します。

5行目は上下左右のマスの値を全て足して変数sに代入しています。
6行目を見ると、マス目を塗りつぶす条件としているので、行き止まりかどうかの判定になります。
つまり3方向が壁の場合は上下左右の値を足すと3になるので空欄セは3になります。
空欄スは今のマスが白つまり、0の場合塗りつぶす必要があるので
Masu[x,y]=0 となり選択肢としては②となります。

7行目は黒く塗りつぶす処理なので 空欄ソは1になります。

何パターンかシミュレーションしていきましょう。

★2列2行
xが2 yが2 の時の判定を行っていきます。
Masu[2-1、2]は左側のマスなので1となります
Masu[2+1,2]は右側のマスなので1となります。
Masu[2,2-1]は上側のマスなので1となります。
Masu[2,2+1]は下側のマスなので0となります。

全て足すと3になります。
今いるマスが0 かつ sが3なので 
今いるMasu[2,2]に1を代入します。

★4列2行
xが4 yが2 の時の判定を行っていきます。
Masu[4-1、2]は左側のマスなので1となります
Masu[4+1,2]は右側のマスなので1となります。
Masu[4,2-1]は上側のマスなので9となります。
Masu[4,2+1]は下側のマスなので0となります。

全て足すと11になり、s=3ではないので、塗りつぶし処理は行いません。

★2列3行
xが2 yが3 の時の判定を行っていきます。
Masu[2-1、3]は左側のマスなので1となります
Masu[2+1,3]は右側のマスなので1となります。
Masu[2,3-1]は上側のマスで先ほど黒く塗ったマスなので1となります。
Masu[2,3+1]は下側のマスなので0となります。

全て足すと3になります。
今いるマスが0 かつ sが3なので 
今いるMasu[2,3]に1を代入します。

この処理を各マス繰り返していきます。


――――

続けて問3の解説をしていきます。
先ほど説明した手順は、袋小路を塗り終わるまで何度もステップ1を繰り返さなければならず、非効率でした。
手順2では行き止まりを見付けたら、その分岐点に到達するまで新たにできた行き止まりを連続して塗る方法になります。

ステップ1は先ほどと同じように外周を除く領域について、上の行から下の行に、各行のマスを左から右の順に着目します。

ステップ2は着目したマスが行き止まりであればそのマスを塗り、ステップ3に進み、そうでなければステップ1を再開します。

ステップ3は着目したマスの上下左右に隣接するマスうち、あらたに行き止まりになった可能性のあるマスに着目し、ステップ2に進みます。

実際にシミュレーションしていきます。
まず、はじめの2列2行目は行き止まりなので塗りつぶします。先ほどの手順1では直ぐに右の判定にうつりましたが、今回は行き止まりだったので、隣接するマス目で白色のマス目に着目します。今回は下のマス目になります。そして、これも行き止まりになるので塗りつぶします。
さらに下のマス目に着目しこれも行き止まりなので、塗りつぶします。
つぎはその右隣のマスに注目しこれは、行き止まりではないので白のままとなります。
ここでステップ1に戻ります。つまり2列2行の判定をしていたので、その右の判定を行います。
では、最後までアニメーションを走らせていきます。
すでに黒い部分も判定しますが、冗長なのでアニメーション上は省略しています。

このように1回目の処理で必要なマスを全て塗りつぶせたので非常に効率的なやりかたとなります。

今説明した処理を擬似言語で見ていきます。
先に空欄部分は正答を表示させておきます。実際に数値を当てはめながら変数がどのように変化するかを理解していきましょう。

1行目と2行目は先ほどと同じで上の行から下の行に判定するために、Yを2から増やして、同じ行でxを1ずつ増やしていく処理になります。

3行目はxの値をiに代入します。yの値をjに代入します。 
敢えて他の変数に入れているのは、隣接する道を判定する際に、行き止まりでなくなった場合に、元々の判定箇所に戻る場所を保持しておくためになります。

4行目は、白マス判定と行き止まり判定、ループの継続条件になります。
行き止まりの場合に、5行目から8行目の処理が繰り返し行われれます。

5行目は今いるマスを壁にするために、1を設定しています。

6行目から7行目について
今回は縦横方向の増減値のdiとdjの変数が追加になっています。
一言で言えば、行き止まりになった時に次はどの方向を見ればいいかを保持します。
例えば、左側のマスが白つまり0の時は、横方向の増減値であるdiはー1になるためdiはー1となります。

右側のマスが白つまり0の時は 横方向の増減値は+1になるためdiは1になります。

このdiの値を求める場合は、今いる場所の左側のマスの値―右側のマスの値で求めることができます。

上側のマスが白つまり0の時は 縦方向の増減値はー1になるためdjはー1になります。
下側のマスが白の時は、下方向の増減値であるdjは+1になるためdjは+1となります。

このdjの値を求める場合は、今いる場所の上側のマスの値―下側のマスの値で求めることができます。

8行目について i←i+di は次に見る横方向のマス座標をiに代入しています。
j←j+djは次に見る縦方向のマス座標をjに代入しています。

では、何パターンか数値を当てはめながら説明していきます。

2列2行目の判定を行っています。
3行目でxは2なのでiにも2が代入されます。
yも2なのでjにも2が代入されます。
4行目でマスが0で上下左右の合計が3なのでTrueとなりループ処理に入ります。
5行目で今いるマスに1を設定し壁にします。
6行目は左マスは1、右マスは1 なので引き算をして 0がdiに代入されます。
7行目は上マスは1 下マスは0 なので引き算をして 1がdjに代入されます。

8行目の i+diは2+0で 2がiに代入されます
j+djは 2+1なので 3がjに代入されます。

ループ処理で下マスの2列3行目の判定を行っています。
4行目でマスが0で上下左右の合計が3なのでTrueとなりループ処理に入ります。
5行目で今いるマスに1を設定し壁にします。
6行目は左マスは1、右マスは1 なので引き算をして 0がdiに代入されます。
7行目は上マスは1 下マスは0 なので引き算をして 1がdjに代入されます。

8行目の i+diは2+0で 2がiに代入されます
j+djは 3+1なので 4がjに代入されます。


ループ処理で下マスの2列4行目の判定を行っています。
4行目でマスが0で上下左右の合計が3なのでTrueとなりループ処理に入ります。
5行目で今いるマスに1を設定し壁にします。
6行目は左マスは1、右マスは0 なので引き算をして 1がdiに代入されます。
7行目は上マスは1 下マスは1 なので引き算をして 0がdjに代入されます。

8行目の i+diは2+1で 3がiに代入されます
j+djは 4+0なので 4がjに代入されます。

つぎの3列4行目の判定は上下左右の合計は2なのでループの継続条件に合致しません。
2行目の親ループに戻り、2列2行目から右隣の3列2行目の判定処理を行います。

このような流れを繰り返すことで効率的に行き止まりを判定することができます。

今回の解説は以上になります。
最後までご視聴ありがとうございました。

【参考サイト・参考文献】

大学入試センター 情報関係基礎過去問ダウンロード(情報処理学会 情報入試委員会)
https://drive.google.com/drive/folders/140pQJOKWzYH2-NvzPCyQdqFPHcZhCSOa

tkmium note 難関進学校の情報科教諭が作成
【解説】 情報関係基礎 平成30年度 センター試験 2018 | ページ 3 | tkmium-note
https://tkmium.tech/jouhoukankei-h30/3/

E.V.ジュニア note 難関進学校の数学科・情報科教諭が作成
マガジン「プログラミング教育」総目次|E.V.ジュニア|note
https://note.com/evjunior/n/ne5610edd5f37

【YouTubeチャンネル】
https://www.youtube.com/c/toppakou

【IT用語動画辞典】
https://toppakou.com/ITWORD/

【解説重要用語】
擬似言語、変数、配列

★私の目標
「とある男が授業をしてみた」 の葉一さん
https://www.youtube.com/user/toaruotokohaichi
※Google社に招待頂いた、「YouTube教育クリエイターサミット2020」で
 葉一さんと文部科学省・Google役員の対談セッションに感銘を受けて、高校情報講座スタートしています。



#情報関係基礎 #大学入学共通テスト #大学入試センター


この記事が気に入ったらサポートをしてみませんか?